# 解决办法 rsyslog 占用内存高解决方法_imjournal.state-CSDN博客
systemctl status rsyslog # 查看有误报错
rm -rf /var/lib/rsyslog/imjournal.state # 有报错就删除这个
systemctl restart rsyslog # 删完重启
# 深入解析
https://blog.espnlol.com/?p=525
# 理解 syslog
原文:linux系统syslog/rsyslog/sysng-ng使用配置 - 知乎
一、syslog详解
1、syslog简介
syslog 系统日志,记录linux系统启动及运行的过程中产生的信息,rhel5.x系统上默认自带了syslog 其配置文件是/etc/syslog.conf。
syslog 默认有两个守护进程:klogd,syslogd。klogd 进程是记录系统运行的过程中内核生成的日志,而在系统启动的过程中内核初始化过程中 生成的信息记录到控制台(/dev/console),当系统启动完成之后会把此信息存放到/var/log/dmesg文件中,可以通过cat /var/log/dmesg查看这个文件,也可以通过dmesg命令来查看。
syslogd 进程是记录非内核的信息。
而为什么需要两个守护进程呢?是因为内核跟其他信息需要记录的详细程度及格式的不同。而这两个守护进程是共用一个配置文件/etc/syslog.conf。
2、syslog配置文件详解
配置文件定义格式为 facility.priority action
facility
facility可以理解为日志的来源或设备,目前常用的facility有以下几种:
1)auth # 认证相关的
2)authpriv # 权限,授权相关的
3)cron # 任务计划相关的
4)daemon # 守护进程相关的
5)kern # 内核相关的
6)lpr # 打印相关的
7)mail # 邮件相关的
8)mark # 标记相关的
9)news # 新闻相关的
10)security # 安全相关的,与auth 类似
11)syslog # syslog自己的
12)user # 用户相关的
13)uucp # unix to unix cp 相关的
14)local0 到 local7 # 用户自定义使用
15)* # *表示所有的facility除了 mark
除mark 用于生成时间戳为内部使用外,还有security为一个旧的key定义,等同于auth,已经不再建议使用。
priority
priority(log level)日志的级别,一般有以下几种级别(从低到高)
debug # 程序或系统的调试信息
info # 一般信息
notice # 不影响正常功能,需要注意的消息
warning/warn # 可能影响系统功能,需要提醒用户的重要事件
err/error # 错误信息
crit # 比较严重的
alert # 必须马上处理的
emerg/oanic # 会导致系统不可用的
* # 表示所有的日志级别
none # 跟* 相反,表示啥也没有
panic、error、warn均为旧的标识符,不再建议使用。
action
(tab隔开) action(动作)为日志记录的位置
系统上的绝对路径# 普通文件 如:/var/log/xxx
| # 管道 通过管道送给其他的命令处理
终端 # 终端 如:/dev/console
@HOST # 远程主机 如: @10.0.0.1
用户 # 系统用户 如: root
* # 登录到系统上的所有用户
selector选择条件
通过小数点符号“.”把facility和priority(level)连接在一起则成为selector(选择条件/选择器)。
可以使用分号“;”同时定义多个选择条件。也支持三个修饰符:
* 所有日志信息
= 等于,即仅包含本优先级的日志信息
! 不等于,本优先级日志信息除外
日志定义实例
http://mail.info /var/log/mail.log # 表示将mail相关的,级别为info及 info以上级别的信息记录到/var/log/mail.log文件中
auth.=info @10.0.0.1 # 表示将auth相关的,级别为info的信息记录到10.0.0.1主机上,前提是10.0.0.1要能接收其他主机发来的日志信息
user.!=error # 表示记录user相关的,不包括error级别的信息
user.!error # 与user.error相反
*.info # 表示记录所有的日志信息的info级别
mail.* # 表示记录mail相关的所有级别的信息
*.* # 都应该懂的.
cron.info;http://mail.info # 多个日志来源用";" 隔开
cron,mail.info#等价cron.info;http://mail.info
mail.*;mail.!=info # 记录mail相关的所有级别的信息,但不包括info级别
一般默认配置
# 表示将所有facility的info级别,但不包括mail,authpriv,cron相关的信息,记录到 /var/log/messages文件
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# 表示将权限,授权相关的所有基本的信息,记录到/var/log/secure文件中.这个文件的权限是600
authpriv.* /var/log/secure
# 表示将mail相关的所有基本的信息记录到/var/log/maillog文件中,可以看到路径前面有一个"-"
# "-" 表示异步写入磁盘,
mail.* -/var/log/maillog
# 表示将任务计划相关的所有级别的信息记录到/var/log/cron文件中
cron.* /var/log/cron
# 表示将所有facility的emerg级别的信息,发送给登录到系统上的所有用户
*.emerg *
# 表示将uucp及news的crit级别的信息记录到/var/log/spooler文件中
uucp,news.crit /var/log/spooler
# 表示将local7的所有级别的信息记录到/var/log/boot.log文件中, local0 到local7这8个是用户自定义使用的,这里的local7记录的是系统启动相关的信息
local7.* /var/log/boot.log
# 紧急消息(emerg级别)将使用wall显示给当前所有登录的用户
*.=emerg *
# 该规则将所有alert以及更高级别的消息定向到操作员的终端,即登录的用户“root”和“joey”的终端。
*.alert root,joey
# 如果是日志服务器格式是:
*.* @192.168.100.1 (使用UDP协议发送)
*.* @@192.168.100.1 (使用TCP协议发送)
syslog默认记录的日志格式有四个字段:时间标签 主机 子系统名称 消息
可以使用tail /var/log/messages 查看
二、rsyslog详解
1、rsyslog介绍
rsyslog是linux系统中用来实现日志功能的服务。默认已经安装,并且自动启用。Rsyslog 是一个 syslogd 的多线程增强版,依然基于Syslog协议(linux6之前默认使用syslog程序,centos6用rsyslog所取代)完成系统日志的处理转发,官方形容它是一个极速(如火箭般快速)的日志处理系统。它提供高性能、极好的安全功能和模块化设计。虽然它基于常规的 syslogd
作用:主要用来采集日志,不生产日志
其特性包括:
支持输出日志到各种数据库,如 MySQL,PostgreSQL,MongoDB ElasticSearch,等等;
通过 RELP + TCP 实现数据的可靠传输(基于此结合丰富的过滤条件可以建立一种 可靠的数据传输通道供其他应用来使用);
精细的输出格式控制以及对消息的强大 过滤能力;
高精度时间戳;队列操作(内存,磁盘以及混合模式等); 支持数据的加密和压缩传输等。
2、rsyslog概念
facility
设施,用来定义日志消息的来源,方便对日志进行分类
日志类型 日志内容
kern 内核信息
user 用户程序产生的相关信息
mail 邮件系统信息
daemon 守护进程产生的信息
auth pam认证系统信息
syslog 日志系统自身信息
authpriv ssh、ftp等登录信息
cron 系统执行定时任务产生的信息
lpr 打印相关信息
mark 服务内部的信息,时间标识
uucp Unix-to-Unix Copy 两个unix之间的相关通信
local0-local7 保留,本地使用
priority
日志级别,定义不同消息的级别
日志等级 说明(级别从低到高,记录信息越来越少)
0 debug 包含详细的开发情报的信息,通常只在调试一个程序时使用。
1 info 通用性信息,一般用来提供有用信息,
2 notice 正常信息,但是较为重要,可能需要处理
3 warning 警告信息
4 error/err 错误信息,某个功能或者模块不能正常工作的信息
5 crit 严重级别,系统或整个软件不能正常工作的信息,例如硬盘错误
6 alert 需要立刻修改的信息,如系统数据库被破坏,ISP连接丢失。
7 emerg 紧急情况,内核奔溃等重要信息
8 none 什么也不记录
日志设施的配置
符号 说明
. 比后面还要高的信息等级都会记录下来
.= 只有后面这个消息等级会被记录下来
.! 除了后面的消息等级,其他的都会被记录下来(注意前面需要先有其他过滤规则,否则什么不记录)
rsyslog.conf组成
modules,模块,配置加载的模块,如:ModLoad imudp.so配置加载UDP传输模块
global directives,全局配置,配置ryslog守护进程的全局属性,比如主信息队列大小(MainMessageQueueSize)
rules,规则(选择器+动作),每个规则行由两部分组成,selector部分和action部分,这两部分由一个或多个空格或tab分隔,selector部分指定源和日志等级,action部分指定对应的操作
模板(templates)
输出(outputs)
常用modules
imudp,传统方式的UDP传输,有损耗
imtcp,基于TCP明文的传输,只在特定情况下丢失信息,并被广泛使用
imrelp,RELP传输,不会丢失信息,但只在rsyslogd 3.15.0及以上版本中可用
规则(rules)
规则选择器(selectors)
selector也由两部分组成,设施和优先级,由点号.分隔。
第一部分为消息源或称为日志设施,第二部分为日志级别。
多个选择器用;分隔,如:*.info;mail.none。
动作(action)
action是规则描述的一部分,位于选择器的后面,规则用于处理消息
消息内容可以被写入到一个日志文件中,也可以写入到数据表表或转发到其他主机, 还可以发送给主机用户 (可以指定用户名,用 * 表示所有)
RULES配置示例
# modules, 要将日志写到mysql中需要加载ommysql模块
$ModLoad ommysql
# rule, send to mysql
#*.* :ommysql:database-server,database-name,database-userid,database-password
*.* :ommysql:127.0.0.1,Syslog,syslogwriter,topsecret
模板(templates)
模板允许你指定日志信息格式
也可用于生成动态文件名,或在规则中使用
**TEMPLATE_NAME:**模板的名字;
PROPERTY:rsyslog本身支持的一些属性参数。
# 使用规则
$template TEMPLATE_NAME,"text %PROPERTY% more text", [OPTION]
## 以时间字符串开头的文件
$template DynamicFile,"/var/log/test_logs/%timegenerated%-test.log"
## 以年月日主机名为目录下的文件
$template DailyPerHostLogs,"/var/log/syslog/%$YEAR%/%$MONTH%/%$DAY%/%HOSTNAME%/messages.log"
## 自定义日志内容格式
$template LOGFMT,"%timegenerated% %FROMHOST-IP% %syslogtag% %msg%\n"
## 引用自定义的 动态文件名 中定义的内容
*.info ?DailyPerHostLogs
*.* ?DynamicFile
*.* /var/log/myinfo.log;LOGFMT
模板元素属性
属性 说明
msg 日志的信息内容,message
hostname 打印该日志的主机名
source hostname属性的别名
fromhost 接收的信息来自哪个节点。这里是dns解析的名字
fromhost-ip 接收的信息来自哪个节点,这里是ip,本地是127.0.0.1
syslogtag 日志记录目标
timegenerated 高精度显示日志时间
timesteamp 同 timegenerated
timereported 日志中的时间戳
syslogseverity 日志严重性等级,数字形式表示
syslogseverity-text 日志严重性等级,文本形式表示
jsonmesg 整个日志对象作为json表示。可能出现数据重复,譬如syslogtag包含着programname,但两者都会分别表示。所以这个属性有一些额外开销,建议只有在实际需要的时候再用。
修改模板日志
vim /etc/rsyslog.conf
# 创建一个名为cky_format的模板,其中 TIMESTAMP:8:15 表示timestamp属性值切片第八位到第十五位。
$template cky_format, "%$NOW% %TIMESTAMP:8:15% %hostname% %syslogseverity-text% %syslogtag% %msg%\n"
$ActionFileDefaultTemplate cky_format
#重启rsyslog
systemctl restart rsyslog
日志格式效果
# NOW | timestamp:8:18| hostname| syslogseverity-text | syslogtag | msg
2023-03-09 09:29:24 mycomputer info systemd: Started System Logging Service.
# 时间戳 | 主机名| 日志等级 | 服务进程 | 日志内容
rsyslog远程传输
1、UDP传输
Server端配置
/etc/rsyslog.conf
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
$AllowedSender UDP, 192.168.10.0/24
# This one is the template to generate the log filename dynamically, depending on the client's IP address.
# 根据客户端的IP单独存放主机日志在不同目录,syslog需要手动创建
$template Remote,"/var/log/syslog/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log"
# Log all messages to the dynamically formed file.
:fromhost-ip, !isequal, "127.0.0.1" ?Remote
# 排除本地主机IP日志记录,只记录远程主机日志
# 注意此规则需要在其它规则之前,否则配置没有意义,远程主机的日志也会记录到Server的日志文件中
Client端配置
/etc/rsyslog.conf
*.* @192.168.10.120
配置完成之后/etc/init.d/rsyslog restart
2.TCP传输
Server端配置
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
$AllowedSender TCP, 192.168.80.0/24
# This one is the template to generate the log filename dynamically, depending on the client's IP address.
$template Remote,"/var/log/syslog/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log"
# Log all messages to the dynamically formed file.
:fromhost-ip, !isequal, "127.0.0.1" ?Remote
Client端配置
/etc/rsyslog.conf
*.* @@192.168.80.120
三、syslog-ng详解
1.syslog-ng简介
- syslog-ng (syslog-Next generation) 是syslog的升级版,syslog-ng有两个版本,一个是收费,一个是开源。
- syslog-ng 应用程序是一个灵活、高扩展性的系统日志工具,主要是用于解决集中日志记录的工具。它的主要特点有 :
- 1、可靠的日志传输。syslog-ng 允许你发送日志到远程的日志服务器上。传输过程使用 TCP ,区别于 syslog 的 UDP ,可以确保不会丢失数据
- 2、通过使用 SSL/TLS 来加密日志传输过程。不过这个功能只有在 premium 版本才提供。
- 3、基于磁盘的缓冲。syslog-ng 可以在网络连接失效时先把日志写入硬盘,等网络连接恢复时再传输到日志服务器上,而且确保日志的顺序不会混乱。不过这个功能也是 premium 版本才提供的。
- 4、直接数据库访问。能够把日志直接存入数据库,以便进行搜索及配合日志分析应用程序。支持 MySQL、Oracle、PostgreSQL、SQLIife ,同样也是 premium 才支持
- 5、支持多种操作系统。包括 Linux、Unix、BSD、Solaris、HP-UX、AIX 等。甚至还可以通过代理和 Windows 主机进行通信
- 6、过滤器和归类。syslog=ng 应用程序可以根据收的喔的日志的内容进行排序、或者根据源ip、应用程序、优先级等。可以通过宏自动建立目录、文件、数据库。支持 regex 和布尔表达式,确保只转发你想要的内容
- 7、支持 ipv4 和 ipv6
开源版本的主页 http://www.balabit.com/network-security/syslog-ng/opensource-logging-system/overview
2.syslog-ng的安装
syslog-ng是基于syslog协议的Unix和类Unix系统的开源软件。您可以执行sudo yum install syslog-ng或sudo apt-get install syslog-ng命令安装Syslog-ng。
Linux服务器上默认安装Rsyslog,但是Rsyslog和Syslog-ng无法同时工作,如果您要使用Syslog-ng请先卸载Rsyslog。
采用yum安装,执行:
yum -y install syslog-ng
yum install -y syslog-ng-libdbi
会安装以下两个软件包
libdbi-0.8.3-4.el6.x86_64
syslog-ng-libdbi-3.2.5-4.el6.x86_64
rhel5.x的系统上默认没有使用syslog-ng来记录日志的,需要自己编译安装,安装方法如下:
yum install gcc*
cd /usr/src
wget http://www.balabit.com/downloads/files/syslog-ng/sources/3.2.4/source/eventlog_0.2.12.tar.gz
tar xvf eventlog_0.2.12.tar.gz
cd eventlog-0.2.12
./configure --prefix=/usr/local/eventlog
make
make install
cd /usr/src
tar xvf syslog-ng_3.3.5.tar.gz
cd syslog-ng-3.3.5
export PKG_CONFIG_PATH=/usr/local/eventlog/lib/pkgconfig
./configure --prefix=/usr/local/syslog-ng
make
make install
将syslog-ng添加为系统服务
vim /etc/init.d/syslog-ng #内容如下
#!/bin/bash
#
# chkconfig: - 60 27
# description: syslog-ng SysV script.
. /etc/rc.d/init.d/functions
syslog_ng=/usr/local/syslog-ng/sbin/syslog-ng
prog=syslog-ng
pidfile=/usr/local/syslog-ng/var/syslog-ng.pid
lockfile=/usr/local/syslog-ng/var/syslog-ng.lock
RETVAL=0
STOP_TIMEOUT=${STOP_TIMEOUT-10}
start() {
echo -n $"Starting $prog: "
daemon --pidfile=$pidfile $syslog_ng $OPTIONS
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch ${lockfile}
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
killproc -p $pidfile -d $STOP_TIMEOUT $syslog_ng
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f $lockfile $pidfile
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p $pidfile $syslog_ng
RETVAL=$?
;;
restart)
stop
start
;;
*)
echo $"Usage: $prog {start|stop|restart|status}"
RETVAL=2
esac
exit $RETVAL
------------------------------------------------------------
chmod a+x /etc/init.d/syslog-ng
killall syslogd
chkconfig --add syslog-ng
chkconfig syslog-ng on
service syslog-ng start
3.syslog-ng配置文件详解
此时syslog-ng服务已经启动起来了,配置文件的位置在安装目录下的etc/syslog-ng.conf
syslog-ng.conf文件里的内容有以下几个部分组成:
# 全局选项,多个选项时用分好";"隔开
options { .... };
# 定义日志源,来源可以是文件, 本地 sockets, 或者远程主机
source s_name { ... };
# 定义过滤规则,规则可以使用正则表达式来定义,这是可选的 。过滤选项非常强大且复杂;可以过滤日志中的任何方面,比如基础的 syslogd 快捷字段,log 等级,主机名,以及任何log中出现的字段或者是数字。
filter f_name { ... };
# 定义目标 ,信息目标可以是文件, 本地 sockets, 或者远程主机
destination d_name { ... };
# 定义消息链可以将多个源,多个过滤规则及多个目标定义为一条链 。将来源 目的 过滤 都给连接起来并且告诉syslog-ng如何处理日志。
log { ... };
详解如下
----------------------------------------------------------------
消息路径由三部分组成:
消息路径 = 日志消息源 + 过滤规则 + 消息目地
其运行过程:消息源 ---> syslog-ng --> 消息命中 --> 对应的日志目的
选项
选项可以改变syslog-ng 的行为,语法如下:
options { option(params);option(params);.... }
options { long_hostnames(off); sync(0); perm(0640); stats(3600); };
更多选项如下
chain_hostnames(yes|no) # 是否打开主机名链功能,打开后可在多网络段转发日志时有效
long_hostnames(yes|no) # 是chain_hostnames的别名,已不建议使用
keep_hostname(yes|no) # 是否保留日志消息中保存的主机名称 ,否时,总是使用来源主机来作重写日志的主机名
use_dns(yes|no) # 是否打开DNS查询功能, syslog-ng的节点安全,并确认所有主机都是可以通过dns解释的,否则请关闭该选项。
use_fqdn(yes|no) # 是否使用完整的域名
check_hostname(yes|no) # 是否检查主机名有没有包含不合法的字符
bad_hostname(regexp) # 可通过正规表达式指定某主机的信息不被接受
dns_cache(yes|no) # 是否打开DNS缓存功能
dns_cache_expire(n) # DNS缓存功能打开时,一个成功缓存的过期时间
dns_cache_expire_failed(n) # DNS缓存功能打开时,一个失败缓存的过期时间
dns_cache_size(n) # DNS缓存保留的主机名数量
create_dirs(yes|no) # 当指定的目标目录不存在时,是否创建该目录
dir_owner(uid) # 目录的UID
dir_group(gid) # 目录的GID
dir_perm(perm) # 目录的权限,使用八进制方式标注,例如0644
owner(uid) # 文件的UID
group(gid) # 文件的GID
perm(perm) # 文件的权限,同样,使用八进制方式标注
gc_busy_threshold(n) # 当syslog-ng忙时,其进入垃圾信息收集状态的时间一旦分派的对象达到这个数字,syslog-ng就启动垃圾信息收集状态。默认值是:3000。
gc_idle_threshold(n) # 当syslog-ng空闲时,其进入垃圾信息收集状态的时间一旦被分派的对象到达这个数字,syslog-ng就会启动垃圾信息收集状态,默认值是:100
log_fifo_size(n) # 输出队列的行数
log_msg_size(n) # 消息日志的最大值(bytes)
mark(n) # 多少时间(秒)写入两行MARK信息供参考,目前没有实现
stats(n) # 多少时间(秒)写入两行STATUS信息,默认值是:600
sync(n) # 缓存多少行的信息再写入文件中,0为不缓存,局部参数可以覆盖该值。
time_reap(n) # 在没有消息前,到达多少秒,即关闭该文件的连接
time_reopen(n) # 对于死连接,到达多少秒,会重新连接
use_time_recvd(yes|no) # 宏产生的时间是使用接受到的时间,还是日志中记录的时间;建议使用R_的宏代替接收时间,S_的宏代替日志记录的时间,而不要依靠该值定义。
消息源:
其语法如下:
source <identifier> { source-driver(params);source-driver(params);... };消息源驱动器 source driver,用来收集日志消息,和系统的syslogd交换信息,记录日志
source s_name { internal(); unix-dgram("/dev/log"); udp(ip("0.0.0.0") port(514)); };
file (filename) # 从指定的文件读取日志信息
unix-dgram (filename [options]) # 打开指定的SOCK_DGRAM模式的unix套接字,接收日志消息 ,用在BSD系统上
unix-stream (filename [options]) # 打开指定的SOCK_STREAM模式的unix套接字,接收日志消息 ,主要用在Linux
udp ( (ip),(port) ) # 在指定的UDP端口接收日志消息
tcp ( (ip),(port) ) # 在指定的TCP端口接收日志消息
sun-streams (filename) # 在solaris系统中,打开一个(多个)指定的STREAM设备,从其中读取日志消息
internal() # syslog-ng内部产生的消息
pipe(filename),fifo(filename) # 从指定的管道或者FIFO设备,读取日志信息
以下选项可以用于unix-stream和unix-dgram日志消息源驱动器的声明:
名字 参数数据类型 描述
owner() 字符串 设置套接字的uid,默认是:root
group() 字符串 设置套接字的gid,默认是:root
perm() 数字 设置权限掩码。八进制数字以0开头,例如:0755表示rwxr-xr-x。
keep-alive() yes/no 当syslog-ng重启动,选择是否保持连接,只用于unix-stream()。默认是yes
max-connections()数字 同时打开的连接的数目限制,只用于unix-stream()日志消息源驱动器。默认是10。
例.使用unix-stream()和unix-dgram()日志消息源驱动器
source s_stream { unix-stream(”/dev/log” max-connections(10)); };
source s_dgram { unix-dgram(”/var/run/log”); };
tcp()和udp()
UDP是一种简单的用户数据报协议,使用这种协议可能会发生日志消息的丢失,而且这种协议没有重传机制;TCP是一种面向连接的传输层协议,不会造成日志消息的丢失。
这两种消息源驱动器都不需要位置参数。默认情况下,syslog-ng会绑定到0.0.0.0:514,在所有有效的端口上监听。可以使用localip()参数来限制其接受连接的端口。
注意:514端口是rshell使用的端口,因此如果syslog-log和rshell同时使用,你需要为syslog-ng选择另外的端口。
Declaration: tcp([options]); udp([options]);
下面是udp()和tcp()可用的选项:
选项名 数据类型 描述 默认值
ip或者iplocalip 字符串 绑定的IP地址 0.0.0.0
udp()和tcp()使用示例:
source s_tcp { tcp(ip(127.0.0.1) port(1999); max-connections(10); }; source s_udp { udp(); };
file()
通 常,内核会把自己的消息送到一个特殊的文件(BSD系统是/dev/kmsg,Linux系统是/proc/kmsg),因此你需要使用file()日志 消息源驱动器来指定这个文件。在Linux中,klogd会读取内核信息,并转发到syslogd进程,klogd在转发之前会对内核消息进行处理,使用 /boot/System.map文件中的符号名代替原来的地址。如果你不需要这种功能,可以使用-x参数运行klogd。
Declaration: file(filename);
file()日志消息源驱动器示例:
source s_file { file(”/proc/kmsg”); };
destination d_mail { file("/var/log/maillog" sync(10)); };
这里定义的sync(10)会覆盖全局配置,表示若写入的日志数量达到10,才写入maillog文件。
pipe()
pipe日志消息源驱动器打开一个命名管道,在这个命名管道监听日志消息。在HP-UX系统中,它用于内部日志消息的获得。
Declaration: pipe(filename);
注意首先你需要使用mkfifo建立命名管道。
例.使用pipe()日志消息源驱动器
source s_pipe { pipe(”/dev/log”); );
sun-streams()
solaris使用STREAMS API把日志消息发送到syslogd进程。你必须在编译syslog-ng时加入这个特征。
新版solaris(>=2.51)中,STREAMS使用一个新的IPC调用门来投递日志消息。syslog-ng支持这种IPC机制。
过滤规则,过滤器
在syslog-ng 中,过滤器执行日志路由,决定日志是否满足通过的条件。其语法如下:
filter <identifier> {expression;}; 表达式中可以包含逻辑操作符 and or not
filter f_name { not facility(news, mail) and not filter(f_iptables); };
更多规则函数如下
facility(..) # 根据facility(设备)选择日志消息,使用逗号分割多个facility
level(..) # 根据level(优先级)选择日志消息,使用逗号分割多个level,或使用“..”表示一个范围
program(表达式) # 日志消息的程序名是否匹配一个正则表达式
host(表达式) # 日志消息的主机名是否和一个正则表达式匹配
match(表达式) # 对日志消息的内容进行正则匹配
filter() # 调用另一条过滤规则并判断它的值 ,可经过多次过滤链
定义规则的时候也可以使用逻辑运算符and or not
日志消息的目的
destination 指定日志消息的去处。目的可以包括一些目的驱动器,指定日志的派发方向。其语法如下:
destination <identifier> { destination-driver(params);destination-driver(params);.....};
destination d_name { file("/var/log/messages"); };
更多动作如下
file (filename) # 把日志消息写入指定的文件
unix-dgram (filename) # 把日志消息写入指定的SOCK_DGRAM模式的unix套接字
unix-stream (filename) # 把日志消息写入指定的SOCK_STREAM模式的unix套接字
udp (ip),(port) # 把日志消息发送到指定的UDP端口
tcp (ip),(port) # 把日志消息发送到指定的TCP端口
usertty(username) # 把日志消息发送到已经登陆的指定用户终端窗口
pipe(filename),fifo(filename) # 把日志消息发送到指定的管道或者FIFO设备
program(parm) # 启动指定的程序,并把日志消息发送到该进程的标准输入
日志路径
来源于指定的消息源,匹配所有指定的过滤器,并送到指定的地址。其语法如下:
log { source(s1); source(s2); ...
filter(f1); filter(f2); ...
destination(d1); destination(d2); ... };
log { source(s_name); filter(f_name); destination(d_name) };
日志的处理流程大致如下:
首先是 "日志的来源 source s_name { ... };"
然后是 "过滤规则 filter f_name { ... };"
再然后是 "消息链 log { source(s_name); filter(f_name); destination(d_name) };"
最后是 "目标动作 destination d_name { ... };"
4.syslog-ng文件配置实例
$syslog-ng_path
/etc/syslog-ng.conf 内容如下
options { long_hostnames(off); sync(0); perm(0640); stats(3600); };
source src {
internal();
unix-dgram("/dev/log");
# 表示日志来源为本机udp的514端口,
udp(ip("0.0.0.0") port(514));
};
filter f_iptables { facility(kern) and match("IN=") and match("OUT="); };
filter f_console { level(warn) and facility(kern) and not filter(f_iptables)
or level(err) and not facility(authpriv); };
filter f_newsnotice { level(notice) and facility(news); };
filter f_newscrit { level(crit) and facility(news); };
filter f_newserr { level(err) and facility(news); };
filter f_news { facility(news); };
filter f_mailinfo { level(info) and facility(mail); };
filter f_mailwarn { level(warn) and facility(mail); };
filter f_mailerr { level(err, crit) and facility(mail); };
filter f_mail { facility(mail); };
filter f_cron { facility(cron); };
filter f_local { facility(local0, local1, local2, local3, local4, local6, local7); };
filter f_acpid_full { match('^acpid:'); };
filter f_acpid { level(emerg..notice) and match('^acpid:'); };
filter f_acpid_old { match('^
acpid
acpid
:'); };
filter f_netmgm { match('^NetworkManager:'); };
filter f_messages { not facility(news, mail) and not filter(f_iptables); };
filter f_warn { level(warn, err, crit) and not filter(f_iptables); };
filter f_alert { level(alert); };
destination console { pipe("/dev/tty10" owner(-1) group(-1) perm(-1)); };
log { source(src); filter(f_console); destination(console); };
destination xconsole { pipe("/dev/xconsole" owner(-1) group(-1) perm(-1)); };
log { source(src); filter(f_console); destination(xconsole); };
destination newscrit { file("/var/log/news/news.crit"
owner(news) group(news)); };
log { source(src); filter(f_newscrit); destination(newscrit); };
destination newserr { file("/var/log/news/news.err"
owner(news) group(news)); };
log { source(src); filter(f_newserr); destination(newserr); };
destination newsnotice { file("/var/log/news/news.notice"
owner(news) group(news)); };
log { source(src); filter(f_newsnotice); destination(newsnotice); };
destination mailinfo { file("/var/log/http://mail.info"); };
log { source(src); filter(f_mailinfo); destination(mailinfo); };
destination mailwarn { file("/var/log/mail.warn"); };
log { source(src); filter(f_mailwarn); destination(mailwarn); };
destination mailerr { file("/var/log/mail.err" fsync(yes)); };
log { source(src); filter(f_mailerr); destination(mailerr); };
destination mail { file("/var/log/mail"); };
log { source(src); filter(f_mail); destination(mail); };
destination acpid { file("/var/log/acpid"); };
destination null { };
log { source(src); filter(f_acpid); destination(acpid); flags(final); };
log { source(src); filter(f_acpid_full); destination(null); flags(final); };
log { source(src); filter(f_acpid_old); destination(acpid); flags(final); };
destination netmgm { file("/var/log/NetworkManager"); };
log { source(src); filter(f_netmgm); destination(netmgm); flags(final); };
destination localmessages { file("/var/log/localmessages"); };
log { source(src); filter(f_local); destination(localmessages); };
destination messages { file("/var/log/messages"); };
log { source(src); filter(f_messages); destination(messages); };
destination firewall { file("/var/log/firewall"); };
log { source(src); filter(f_iptables); destination(firewall); };
destination warn { file("/var/log/warn" fsync(yes)); };
log { source(src); filter(f_warn); destination(warn); };
filter f_ha { facility(local5); };
destination hamessages { file(/var/log/ha); };
log { source(src); filter(f_ha); destination(hamessages); };
修改完 syslog-ng 之后要重启服务:
# /etc/init.d/syslog-ng restart
测试
日志一般为认证日志,可以先尝试打开一个新的登录窗口,使用su 或者是 sudo 都可以。接着检查 /var/log/auth.log 文件。在客户端上进行一些操作,接着检查 /var/log/HOSTS 是否已经为远程客户端创建新的目录。
另外一个方法是使用更加高级的 logger 命令:
# logger “this is only a test”
# logger -p auth.debug “this is only a test”
tcp传输
服务端配置:
options {
flush_lines (0);
time_reopen (10);
log_fifo_size (1000);
long_hostnames (off);
use_dns (no);
use_fqdn (no);
create_dirs (no);
keep_hostname (yes);
};
#Define source
source s_network {
tcp(ip(0.0.0.0) port(514));
};
#Define filter rules
#filter f_local0 { level(info..emerg); };
#Define destination file path
destination d_local0 { file("/var/log/local0.log" perm(0755) dir_perm(0755) create_dirs(yes)); };
# Write to destination files
log { source(s_network); destination(d_local0); };
客户端如下:
options {
flush_lines (0);
time_reopen (10);
log_fifo_size (1000);
long_hostnames (off);
use_dns (no);
use_fqdn (no);
create_dirs (no);
keep_hostname (yes);
};
source s_sys {
unix-stream ("/dev/log");
internal();
};
filter f_auth { facility(auth); };
destination center_log_server { tcp("192.168.10.112" port(514)); };
log { source(s_sys); filter(f_auth); destination(center_log_server); };
简单配置:
source告知日志来源于/dev/log,unix-stream 打开指定的SOCK_STREAM模式的unix套接字,接收日志消息和internal(syslog本身产生日志);
定义filter为auth策略;
告知日志服务器为192.168.10.112,端口为514,tcp协议。
然后重启客户端和服务端的syslog-ng进程。
sudo /etc/init.d/syslog-ng restart
或
重启服务 systemctl restart syslog-ng
systemctl status syslog-ng