将 OrangePi 打造成中央日志服务器
在 OrangePi 上配置 Rsyslog Server
安装、启动 rsyslog 服务
首先确定 OrangePi 上已经启动了 rsyslog 服务
sudo systemctl status rsyslog
● rsyslog.service - System Logging Service Loaded: loaded (/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2018-12-19 09:36:25 HKT; 4 days ago Docs: man:rsyslogd(8) http://www.rsyslog.com/doc/ Main PID: 883 (rsyslogd) Tasks: 4 (limit: 1029) CGroup: /system.slice/rsyslog.service └─883 /usr/sbin/rsyslogd -n Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
若没有安装 rsyslog 服务则使用下面语句进行安装
sudo apt update && apt install rsyslog
若没有启动 rsyslog 服务,则使用下面语句启动
sudo systemctl enable rsyslog sudo systemctl start rsyslog
配置 /etc/rsyslog.conf
rsyslog 的主配置文件是 /etc/rsyslog.conf
,在该文件中默认还会加载 /etc/ryslog.d
中所有的配置信息。
开启 TCP/UDP 监听服务
配置文件中的的一部分是加载模块,不同的模块能为 rsyslog 提供不同的能力。
################# #### MODULES #### ################# module(load="imuxsock") # provides support for local system logging #module(load="immark") # provides --MARK-- message capability # provides UDP syslog reception #module(load="imudp") #input(type="imudp" port="514") # provides TCP syslog reception #module(load="imtcp") #input(type="imtcp" port="514") # provides kernel logging support and enable non-kernel klog messages module(load="imklog" permitnonkernelfacility="on")
为了可以让其他主机通过网络将日志内容推送到本服务器,必须开启 TCP 或 UDP 的监听服务,如上面的例子中可以看出,rsyslog 默认监听端口是 514
,不过你可以改成任意想要的值。
这里我把 TCP 和 UDP 的监听服务都打开:
# provides UDP syslog reception module(load="imudp") input(type="imudp" port="514") # provides TCP syslog reception module(load="imtcp") input(type="imtcp" port="514")
配置日志行为规则
在默认 /etc/rsyslog.conf
文件中最后一行通过 $IncludeConfig /etc/rsyslog.d/*.conf
指令,加载了 /etc/ryslog.d
下的所有配置文件。
而 /etc/rsyslog.d/
目录下默认只有一个 50-default.conf
配置文件,配置了默认的日志存储规则。 这里文件名中的 50
决定了加载的顺序,rsyslog按编号顺序从小到大加载各个配置文件。
我们新建一个 10-remote.conf
来定义存放远程日志的存储规则.
sudo touch /etc/rsyslog.d/10-remote.conf
一个日志行为规则的格式大概是这样的:
服务.级别 行为
其中,
- 服务: 指定了产生日志信息应用/进程的类型,可以是 auth,cron,daemon,kernel,local0 到 local7,或者用
*
来表示匹配所有的类型的服务 - 级别: 指定了日志信息的重要程度,可以是 emerg,alert,crit,err,warn,notice,info,debug,或者
*
来匹配所有级别的消息 - 行为: rsyslog可以给消息指定多种行为:
- 指定一个本地文件路径,表示将日志写入该文件(可以 /dev/console 这样的终端文件)
- 用
IP:port
的格式来指定一个远程的 rsyslog 服务器,表示把消息转发到那个服务器(在 IP 前加上 @ 则表示通过 UDP 转发,加上 @@ 表示 TCP 转发)。 - 使用
stop
指令表示丢弃该日志信息。 - 使用
|管道文件
表示把日志写入管道文件中,该管道文件需要先用mkfifo
预先创建好 - 使用
:omusrmsg:用户1,用户2...
表示若这些用户登陆到系统上,将会收到这些信息. - 可以使用
:omusrmsg:*
来表示所有用户 - 使用
^程序;template
将消息作为程序的命令行参数进行运行 - 数据库
模板
我们可以使用模板来定义 日志格式
或者动态生成 日志文件路径
,一个模板由 $template
指令,模板名,模板内容和可选项这几部分组成,其格式为:
$template 模板名,"模板内容",模板可选项
模板内容
在 模板内容
中可以使用 %属性名:截取开始位置:截取结束位置:属性选项%
这样一种特殊语法来将消息属性嵌入消息内容中。
注意,这些属性名是大小写敏感的,常用属性名包括:
- msg
- 日志的内容
- rawmsg
- 从 socket 收到的日志内容,常用语调试
- HOSTNAME
- 消息从哪台主机产生的
- FROMHOST
- 消息从哪台主机上转发过来的,但不一定是最开始产生消息的那个主机
- syslogtag
- 消息的标签
- syslogserverity
- 消息级别,用数字表示
- syslogserverity-text
- 消息级别,用文字说明
- syslogfacility
- 消息服务,用数字表示
- syslogfacility-text
- 消息服务,用文字表示
- timegenerated
- 收到消息的时间戳
- timereported / TIMESTAMP
- 产生消息的时间戳
- APP-NAME
- 产生消息的应用名称
- PROCID
- 产生消息的进程号
- MSGID
- 消息编号
- $NOW / $YEAR / $MONTH / $DAY / $HOUR / $MINUTE
- 当前时间信息
截取开始位置
和 截取结束位置
用于截取属性的部分内容,要注意的是,它们从 1
开始计数
属性选项
则用于对属性内容进行格式化,可以是:
- uppercase
- 转换成大写形式
- lowercase
- 转换成小写形式
- drop-last-lf
- 删掉消息中最后一个
LF
- date-mysql
- 格式化成mysql的日期格式
- date-rfc3164
- 格式化成RFC 3164的日期格式
- date-rfc3339
- 格式化成RFC 3339的日期格式
- escape-cc
- 使用
#<XXX>
的格式转译消息中的控制字符 - space-cc
- 使用空格代替消息中的控制字符
- drop-cc
- 删掉消息中的控制字符
模板可选项
目前定义的可选项包括 sql
和 stdsql
,这两个选项只有在想将日志内容存入数据库中时才有用。其中:
sql
的意思是按照 MYSQL 的要求转换模板内容,即将单引号和反斜杠进行转移。stdsql
则会将模板内容按标准 SQL 的要求进行转换,即将内容中单引号替换成双单引号。
定义我们的远程日志模板
$template RemoteLogs,"/var/log/%HOSTNAME%/%APP-NAME%.log" *.* ?RemoteLogs & ~
这里我们定义了一个远程日志模板,然后定义将所有日志写入远程日志模板指定的文件中,最后这句 & ~
表示rsyslog不要继续再处理该信息了
重启 syslog 服务
sudo systemctl restart rsyslog
然后你会看到 /var/log/
目录下多了个 localhost
目录,里面有很多日志
lujun9972@orangepipc2:/var/log/localhost$ ls -l total 16 -rw-r----- 1 syslog adm 585 Dec 23 23:15 CRON.log -rw-r----- 1 syslog adm 558 Dec 23 23:14 rsyslogd.log -rw-r----- 1 syslog adm 85 Dec 23 23:14 sudo.log -rw-r----- 1 syslog adm 216 Dec 23 23:14 systemd.log lujun9972@orangepipc2:/var/log/localhost$ pwd
客户端配置
安装并启动 rsyslog 服务
我们首先需要一个 rsyslog 服务才能将日志转发到中央日志服务器上,在 archlinux 上需要通过 AUR 来安装 rsyslog
aurman -S rsyslog sudo mkdir -p /var/spool/rsyslog # 手工创建/etc/rsyslog.conf中$WorkDirectory定义的工作目录 sudo systemctl enable rsyslog.service sudo systemctl start rsyslog.service systemctl status rsyslog.service
或者,如果安装有 Docker,可以通过下面命令运行 Rsyslog Docker 容器
docker run -ti rsyslog/syslog_appliance_alpine
注意:根据 man rsyslogd
的说法,rsyslogd 默认从 /dev/log
这个 UNIX 域套结字文件中读取日志消息(/dev/log
又实际上是 /run/systemd/journal/dev-log
的软链接)但根据 https://www.freedesktop.org/wiki/Software/systemd/syslog/ 的说法:
Note that it is now the journal that listens on /dev/log, no longer the BSD syslog daemon directly. If your logging daemon wants to get access to all logging data then it should listen on /run/systemd/journal/syslog instead via the syslog.socket unit file that is shipped along with systemd. On a systemd system it is no longer OK to listen on /dev/log directly, and your daemon may not bind to the /run/systemd/journal/syslog socket on its own. If you do that then you will lose logging from STDOUT/STDERR of services (as well as other stuff).
也就是说,在 systemd 的系统中,rsyslogd 并不监听 /dev/log
文件,它通过 imuxsock
模块来监听 /run/systemd/journal/socket
文件
配置客户端的 /etc/rsyslog.conf
按照实际需求,将指定日志转发到中央日志服务器上。比如要将所有日志都转发到中央日志服务器,则可以在配置文件中加上
*.* 192.168.1.9:514
其中 192.168.1.9
就是中央日志服务器,即 OrangePi 的 IP 地址, 514
则是监听端口
重启 rsyslog 服务
sudo systemctl start rsyslog.service systemctl status rsyslog.service
修改 /etc/systemd/journald.conf
开启其中的 ForwardToSyslog
ForwardToSyslog=yes
根据 man journald.conf
的说法:ForwardToSyslog=
表示是否将接收到的日志消息转发给传统的 syslog 守护进程,默认值为 no。 如果设为 yes,则会将消息转发到 /run/systemd/journal/syslog
。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论