为什么不能往特定目录记录日志?
这个问题的来由是这样的:某天我需要在内网一台已经配置好的Linux服务器上面,配置一整套与线上正式环境完全相同的测试环境。其中有一个步骤就是安装HAProxy,安装的过程基本还算顺利。配置并运行后发现,服务倒是起来了,但日志却没有记录到指定的文件当中。
需要说明的是,HAProxy这里选用了syslogd的方式,在/etc/sysconfig/syslog里面开了-r -x参数,然后在 /etc/syslog.conf 里面添加了一行“local3.* /mydir/logs/haproxy.conf”,同时修改好haproxy的配置"log 127.0.0.1 local3 info"。本以为这么配置一下就大吉了,但是实际上却发现该目录下面没有该日志文件,这就诡异了。由于一开始配置错误,选择了local7,于是日志记录到了/var/log/boot.log里面去了。所以很明显,该问题不是因为HAProxy或者syslogd配置错误导致。通过使用ls -l以及getfacl来查看各个目录和文件的情况,发现测试环境和正式环境是完全一致的。那么,到底撞什么鬼了?
经过一番查找,发现了这么一篇FAQ,发现原来:
- /etc/syslog.conf的配置里面不应该使用空格而是"tab",来区分前面的local3.*和后面的目录;
- syslogd不会自己创建文件,要你自己先创建文件(比如用touch /mydir/logs/haproxy.log)。
我第一个念头就是“真狗屎”,你说这叫什么事啊,tab才行空格就不行,还要自行先创建文件。好吧,为了安全,还是自己动手丰衣足食好一点。由于凑巧使用的是tab而不是空格,第一个问题我没有遇到。而第二个问题,我确实没有创建该文件,只好老老实实touch了一下。可是touch完了,这个文件中还是没有任何的日志,哪怕我狂刷浏览器。这就奇了怪了!
经过咨询周围了解linux的同学,还有当初架设线上服务器的前同学,最后终于发现……他们也不知道为什么。非常沮丧的我只好“胡乱瞎试”:
- 既然我自己创建的目录里面不能记录日志,但是/var/log可以记录,那肯定是这两个目录的某种差异,甚至最可能的就是权限差异造成的;
- 既然/var/log可以记录,那肯定可以在这个目录当中创建新的log;
- 既然可以配置,那干脆把所有日志都记到某个文件当中好了。
于是配置/etc/syslog.conf,添加一行“*.* /var/log/debug2.log”,并touch之,然后service syslog restart。这时候通过more /var/log/debug2.log就会发现,里面有那么一行:
某年某月的某一天 时分秒 机器名字 setroubleshoot: SELinux 正在阻止访问带有默认标签 default_t 的文件。 For complete SELinux messages. run sealert -l 某个GUID
好吧,我手贱,语言选了中文,懒得改回去了。英文版本的应该是“…… SELinux is preventing access to files with the default label, default_t. ……”。
上述信息的含义,是安全上下文环境设置不正确导致的,通过使用命令 ls -Z /mydir/logs可以看到该目录下面的上下文设置信息,如下所示:
-rw-r--r-- root root root_u:object_r:default_t haproxy.log
根据某处搜索的结果,发现setfattr -x security.selinux可以解决这个问题,很是高兴。但结果一运行,就会告知“没有足够的权限”。NND,我可是用的root啊!经询问才发现,原来是开启了SELinux的缘故。于是有人提供了另一个方案,就是使用setup将selinux给禁用了。
禁用这个方法肯定可以,但显然不是最好的办法。所谓SELinux,就是为了提高系统安全性的东西。禁止它,一定是比较糟糕的实施方式。那应该怎么办呢?
嗯,很简单,参照/var/log这个目录,及其内部文件的响应设置即可(使用命令ls -Z查看)。具体一点,就是执行:
chcon -u system_u -t var_log_t 文件或目录路径
或者
chcon -u system_u -t var_log_t -R 目录路径
其中后者会将该目录下所有的子目录和文件都设置成相同的安全参数,经过这样的设置,日志的记录就成功了。
总结:
- 配置啥的都对了,也有可能因为各种安全性的原因而无法正常运行;
- 由于Linux的设计思路是“没有错误”就不输出,但实际上有些时候因为配置的问题,一些错误信息也是不输出的,导致你总觉得正常,但偏偏就不正常。此时一定要想办法让其尽可能输出详细的信息,例如将所有系统/应用的日志都输出到某个日志文件当中。
(待续)
没有评论:
发表评论