IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

配置 syslog-ng 的服务器简介

扶凯 2012-01-24 14:00:12 累计浏览 3,423 次
本机暂存

如果没有 ChinaCache 那样,直接自己做一个分布的日志解决方案,使用 syslog-ng 可能是一个很好的免费方案
我们简单的来想 syslog-ng ,可以简单的看成取代 syslog 的的日志服务器,企业级的.目前我们使用的 syslog-ng 开源版本是启动于十年之前的 syslog-ng 项目的“直系后代”.syslog-ng可运行与“server”和“agent”模式,分别支持 UDP、可靠的TCP和加密的TLS协议.syslog 可以用来在混合复杂的环境里建立灵活的、可靠的日志服务器.

syslog-ng开源版本的特性还有:

1. 支持SSL/TSL协议
2. 支持将日志写入数据库中,支持的数据库有MySQL, Microsoft SQL (MSSQL), Oracle, PostgreSQL, and SQLite.
3. 支持标准的syslog协议
4. 支持filter、parse以及rewrite
5. 支持更多的平台
6. 更高的负载能力

syslog-ng 对性能进行了优化,可以处理巨大的数据量.一般的硬件,在正确的配置下,可以实时地处理75000个消息每秒钟,超过24GB的RAW日志每小时.

前言

在标准的 Linux 中有一个 syslog .通常设置格式为

<设备 facility>.<严重性 priority>.<动作>

默认系统预先定义了12+8个(mail、news、auth等)facility,八个不同的优先级(alert到debug).通常我们也只能根据这些来做一些操作.备注中有详细的解释.

在 syslog-ng 中.就不一样,非常强大,只需要定义来源,和目标位置,有可能需要定义一个过滤.
示例为:

{Source;filter;destination;}

其中的每一个字段的会在下面进行详细的说明,这也必须在 syslog_ng.conf  文件中定义你想要的.

安装 syslog-ng

这个不用细讲了吧,直接来 yum

1
  yum install syslog-ng

配置全局配置

全局配置的是在  /etc/syslog-ng/syslog-ng.conf 中,是在 options 的选项中.示例:

01
02
03
04
05
06
07
08
09
10
options {
        sync (0);
        time_reopen (10);
        log_fifo_size (1000);
        long_hostnames (off);
        use_dns (no);
        use_fqdn (no);
        create_dirs (no);
        keep_hostname (yes);
};
重要和不常见全局选项介绍
1
2
3
4
5
6
7
8
9
long_hostnames   是否使用长主机名记录,也就是使用完全符合标准的域名.
flush_lines      设置一次向目的地发送几行消息.如果设成0,一收到消息就发送
sync_freq      在写入文件之前,可以缓冲的日志消息行数
use_dns        是否使用 DNS ,选项包括:yes、no和persist_only.选项设成了‘persist_only’,
                  因而会检查  /etc/hosts 文件,以解析主机名,这时并不依赖DNS 服务器.
stats_freq     两个状态消息(关于丢失日志消息的统计消息)消息之间间隔的时间(以秒为单位).0表示禁用发送STATS消息.
normalize_hostnames  是否对主机名转换成小写.
keep_hostname  如果要进行转发或透过外部服务器传送,该选项就会保留主机名,那样主机最终到达中央服务器后,
                  主机名会一并到达,而不是依赖DNS(或/etc/hosts)


建议加上 stats_freq(600)和 stats_level(2),以便从服务器获取统计消息,如果有数百个设备向中央系统服务器传送日志,启用统计功能让我们能够检查统计消息和可能丢失的消息.

日志源(Source)

在 syslog-ng 的系统日志工具设置日志来源的信息,只需要在配置文件中添加几行配置.典型的来源是来自己网络上其它机器的信息,所以我们需要设置监听器,示例:

1  
source s_net { tcp((ip(127.0.0.1) port(1000) max-connections 100)); udp (); };

详解
source s_net   表示进行日志来源类型,s_net 是网络监听
tcp(ip(127.0.0.1) 监听的网卡的地址,大多时候你会设计你的外网卡上的  IP,其它客户端会通过这个来传送日志
port (1000)    端口
max connections  允许同时连接的数量
udp ()    启用udp.
encrypt(allow)  对系统日志消息采用加密(基于TLS/证书).

 

可用的来源日志的:

internal syslog-ng 内部产生的消息
unix-stream 打开指定的SOCK_STREAM模式的unix套接字,接收日志消息
unix-dgram 打开指定的SOCK_DGRAM模式的unix套接字,接收日志消息
file            打开指定的文件读取日志信息
pipe,fifo 打开指定的管道或者FIFO设备,读取日志信息
tcp     在指定的TCP端口接收日志消息
udp    在指定的UDP端口接收日志消息

目的地(destination)

   当我们的服务器接收到日志信息后,怎么处理,当然需要发送到某个本地上的设备.可以选择的目标文件有下面这些.

file()  file 是 syslog-ng 最重要的日志消息目的驱动器之一.使用它,你可以把日志消息定向到一些文件中.
program() 这个支持给日志消息传送给一个程序.
pipe()     通过pipe()日志消息目的驱动器把日志消息发送到/dev/xconsole之类的命名管道.
unix-stream()和unix0dgram()   通过这两个日志消息目的驱动器把日志消息发送到一个SOCK_STREAM或者SOCK_DGRAM模式的UNIX套接字.
udp()和tcp()   使用TCP或者UDP协议把日志消息送到本地网络上或者internet上的另外的主机.
usertty()        使用这个日志消息目的驱动器把日志消息送到一个登录用户使用的终端.
program() 驱动器fork出一个进程,使用给定的参数执行一个特定的程序,然后把日志消息送到这个进程的标准输入设备.

file() 是用的最多的,下面是样例:

1
2
3
4
5
6
7
8
9
destination d_cons { file("/dev/console"); };
destination d_mesg { file("/var/log/messages"); };
destination d_auth { file("/var/log/secure"); };
destination d_mail { file("/var/log/maillog" sync(10)); };
destination d_spol { file("/var/log/spooler"); };
destination d_boot { file("/var/log/boot.log"); };
destination d_cron { file("/var/log/cron"); };
destination d_kern { file("/var/log/kern"); };
destination d_mlal { usertty("*"); };

可以从上面见到,默认值服务器日志消息存到这些指定的子目录中.象上面的验证消息被归类成(/var/log/secure), 那么它会把这个存成 /var/log/secure 文件中,加上一些附加信息(主机名和日期/时间等).

我们可以扩展这个,让日志消息存进其他应用程序的管道、SQL数据库(mysql、MS SQL和Oracle等)、远程日志服务器.

现在我有好多个主机的日志想存到这,所以我需要给每个主机的放到不同的文件夹,让文件夹含有每个主机名,这时我们象下面一样可以使用 $HOSTNAME 的变量.

destination d_net_secure { file("/var/log/syslog/remote/$HOSTNAME/secure" create_dirs(yes)); };

其实目的的设备可以象源的设备一样,有多种,另外,可以在目的中加个参数 create_dirs(yes) 可以自己建目录.可以有的变量很多如时间的.

扩展 file 的宏(用在目的地选择的 file 中的): 

下面这些宏和 Perl 中一样,需要加 $ 就行了.
HOST 日志消息的源发主机名.如果日志消息穿过几个主机,并且chain_hostname()功能已经打开,就使用第一个主机名.
FACILITY 日志消息来自的日志设备
PRIOPRITY/LEVEL 日志消息的优先级
PROGRAM 发送日志消息的程序
YEAR  发送日志消息的年份,这个宏既可以指定日志消息送出的时间,也可以指定日志消息收到的时间.这由use_time_recvd()选项控制
MONTH  发送日志消息的月份
DAY  发送日志消息的日子
HOUR 小时
SEC 秒

相关参数:

log_file_size()  数字 输出文件的条目数 使用全局设定
sync_freq()  数字 当日志消息达到一定数目就写入文件 使用全局设定
encrypt()   给日志文件加密 使用全局设定
compress()   压缩日志文件 使用全局设定
owner() 字符串 指定日志文件的所有者 root
group() 字符串 指定日志文件所有者的组 root perm() 数字 建立时日志文件的权限掩码 0600
dir_per() 数字 建立目录时的权限掩码 0600
create_dirs() yes/no 如果目录不存在就建立 no

过滤(filter)

  当日志工具本身就能够过滤日志消息这是多么强大.有了过滤功能,我就可以做非常多的事:比如可以对端口扫描进行过滤,对程序日志出错进行过滤,只要根据消 息过滤到不同的文件.syslogng 还可以指定对哪些主机过滤,目的地过滤,还可以使用我喜欢正则表达示,还能使用 or 和 and.

   过滤表达式:

1
  filter <identifier> { expression; };

<identifier>是你为过滤器赋予的名称.
<expression> 表达式中可以包含逻辑操作符(and、or、not)和函数.

过滤函数:

facility() 根据设备选择日志消息
level() 或者priority() 根据优先级选择日志消息
program() 日志消息的程序名是否匹配一个正则表达式
host() 日志消息的主机名是否和一个正则表达式匹配
match() 对日志消息的内容进行正则匹配
filter() 调用另一条过滤规则并判断它的值

firewall 的过滤示例:
  1
filter firewall_filter { host("x.x.x.x") and match("Denial of Service"value("MESSAGE")); };

创建一个过滤器名为'firewall_filter',它监听来自 x.x.x.x 主机的日志消息,当出现消息为 ‘Denial of Service' 时工作.

多个主机的配置(or)

filter f_web { host("10.1.1.1") or host("10.1.1.2") };

根据 syslog 的严重性来过滤(level)

filter f_debug { level(debug); };

根据 syslog 的设备来过滤(facility)

filter f_auth {facility(auth,authpriv, news, mail);};
完整的日志输入到输出的配置

还记昨我们最上面提到的 syslog-ng 的格式吧, 就是 {Source;filter;destination;}.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
source s_net { 
  
    udp(ip(0.0.0.0) port(514));
  
};
  
filter firewall_filter {
  
      host("x.x.x.x") and match("Denial of Service"value("MESSAGE"));
  
};
  
destination d_net_secure {
  
       file("/data/syslog/$HOSTNAME/secure-$YEAR$MONTH$DAY.log" owner(root) group(root) perm(0600) dir_perm(0700) create_dirs(yes));
  
};
log firewall_filter {
  
    source(s_net);
  
    filter (firewall_filter);
    destination(d_net_secure);
  
};

在上面是一整个日志的详细配置,从本地接口上接收到日志信息,然后在日志处理的中间,通过了一个 filter 来过滤完后,存到指定的地方.

syslog-ng 测试

在其它的节点的 Linux 上在 syslog.conf 中配置

*.*                   @syslog-ng 服务器 ip

然后在这台,就可以使用 logger 这个程序来进行这些测试 ,示例:

1
  logger -p local3.info message

这样在syslog-ng 的服务器上就能见到 message 的信息了

备注:

facility 定义了消息类型

auth            用户认证
authpriv        有特权的用户认证
cron            cron守护进程
daemon          各种系统守护进程
ftp             ftp守护进程
kern            内核消息
local0-local7   保留用于本地用法
lpr             打印机  
mail            邮件    
news            新闻    
syslog          内部syslog
uucp            uucp系统
user            各种用户程序来的消息

syslog 优先级: 
1
2
3
4
5
6
7
8
emerg   最严重的错误 (如system panic)
alert   需要立即处理的严重错误
crit    critical warming
err 普通错误
warn    警告信息
notice  比较不严重的信息
info    普通信息
debug   除错信息

同分类推荐文章

  1. How to Set Up Homebrew Tap for Private CLI Tools: A Complete Guide (2026-05-27 02:13:03)
  2. WARNING: detected duplicate paths to the same disk导致crs无法正常启动故障解决 (2026-05-24 22:24:49)
  3. Terraform 极简入门:从 AWS-CLI 到基础设施即代码(IaC) (2026-05-20 08:00:00)

查看更多 DevOps 文章 →

建议继续学习

  1. Redis内存存储结构分析 (累计阅读 7,086)
  2. ssh连接超时解决办法 (累计阅读 5,562)
  3. MySQL error log 输出到syslog (累计阅读 4,882)
  4. tailf and tail -f (累计阅读 4,867)
  5. Nginx 响应 400 的处理 (累计阅读 4,506)
  6. 说说使用mysqlbinlog按时间查询二进制日志时容易疏忽的地方 (累计阅读 4,242)
  7. 删除查看二进制日志 (累计阅读 3,824)
  8. TIME_WAIT状态消除方法-快速回收 (累计阅读 3,782)
  9. 根据status信息对MySQL服务器进行优化(一) (累计阅读 3,704)
  10. 关于Rsyslogd 的一些配置 (高性能、高可用 rsyslogd) (累计阅读 3,668)