我有一个 python 告警脚本部署在多台服务器,现在需要让这个脚本的运行日志写入到 /var/log/zabbix 目录下,但是没有服务器的 root 权限,无法直接在 /var/log/zabbix 下创建日志文件,尝试使用 syslog ,可以无 root 权限写入日志到 /var/log/syslog ,google 了一圈没找到怎么写入到 /var/log 下的指定目录,求解
1
cpstar 2022-04-19 17:28:17 +08:00
先 root 创建一个 /var/log/zabbix 然后 chown 给相应用户?
|
2
aaa5838769 2022-04-19 17:31:23 +08:00
目录权限修改一下吧。
|
3
adoal 2022-04-19 18:21:05 +08:00 via iPhone
你的脚本又不是 zabbix 的一部分,为什么要往 /var/log/zabbix 下写东西?
|
4
dndx 2022-04-19 18:32:46 +08:00
syslog
|
5
k9982874 2022-04-19 18:48:44 +08:00
把你的用户加入 zabbix 组,设置目录对 zabbix 组可写
|
6
documentzhangx66 2022-04-19 19:16:18 +08:00
1 楼正解,就拿装 Oracle 的过程来分析一下:
以 root 用户登录 shell: 1.添加用户 oracle: useradd oracle 2.添加用户组 oinstall /usr/sbin/groupadd oinstall 3.把 oracle 用户拉到 oinstall 用户组里 /usr/sbin/usermod -g oinstall -G dba oracle 4.创建目录,因为当前用户是 root ,所以创建的目录,权限属于 root: mkdir -p /opt/oracle/ 5.把目录 /opt/oracle 的所有权限赋值给用户 oracle 与用户组 oinstall chown -R oracle.oinstall /opt/oracle |
9
adoal 2022-04-19 23:01:56 +08:00 4
@zedpass “zabbix 的告警脚本”是什么意思?是你从 zabbix 外部独立运行这个脚本,还是会在 zabbix 运行时触发?
前者的话跟 zabbix 没有任何关系,只是你从心理上觉得适合“统一放到 zabbix 目录下”而已。如果是后者,(我不懂 zabbix ,按一般情况推理)那运行时是以 zabbix 身份启动的,那一般不是很建议自己搞日志,应该通过 zabbix 提供的机制……如果没有的话,真是个人畜无害的小白花纯脚本,需要自己来搞日志,那也不应该放到 /var/log/zabbix 下。 另外,你这个话题提供的 context 不太足,让人没办法判断。你在这个工作里是什么角色?服务器拿不到 root ,那我按一般情况推理来假设,你应该不是这个服务器的“法定”运维管理人……那应该去找对应的人协商应该怎么办。是给你权限,还是由对方部署,还是按对方的要求把日志文件写到指定的地方……总之靠你在 v2 就这么没有 context 地莫名其妙发一帖,别人又不知道你的实际情况,没法给出准确的建议。 一般来说,“我没有服务器 root 权限”这事不是个纯粹的技术问题。它的本质是“我并不是所在的组织机构里认可的能合规管理这台服务器的人”,是人的职权问题。操作系统里帐号、文件系统的权限,只不过是管理策略落实到技术上的投影。你首要该做的是把职权的障碍打通。 |
10
adoal 2022-04-19 23:03:31 +08:00
@zedpass syslog 可以通过 /etc/syslog.conf (或者 rsyslog.conf )来配置,但……这是系统全局配置,肯定又要 root 的。
|
11
raysonx 2022-04-20 07:39:40 +08:00 1
可以按 1 楼的方法先为你的脚本创建一个用户,比如 myapp ,然后创建于一个子目录 /var/log/myapp ,用 chown myapp: -R /var/log/myapp 修改目录权限。
然而现在更优雅的办法是直接把日志输出到 stderr ,然后用 systemd 等工具启动服务自动管理日志。 |
12
HeyEvan 2022-04-20 12:57:41 +08:00
programName="Your Program"
tee /etc/rsyslog.d/${programName:?'-'}.conf << EOF \$template CleanMsgFormat, "%msg%\n" \$template ${programName:?'-'}LogPath, "/var/log/zabbix/%programname%-%\$YEAR%-%\$MONTH%-%\$DAY%.log" if \$programname == '${programName:?'-'}' then ?${programName:?'-'}LogPath; CleanMsgFormat & stop EOF 重启就好了 systemctl restart rsyslog |