将 OrangePi 打造成中央日志服务器

发布于 2023-03-14 20:48:21 字数 8240 浏览 116 评论 0

在 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
删掉消息中的控制字符

模板可选项

目前定义的可选项包括 sqlstdsql,这两个选项只有在想将日志内容存入数据库中时才有用。其中:

  • 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

烙印

暂无简介

文章
评论
26 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文