syslog-ng
syslog-ng 是一个 syslog 实现,它可以根据强大的过滤器指令从源接收日志消息并将其转发到目标。尽管它的起源是 syslog,但它是一个非常通用的日志管理工具,能够消费结构化和非结构化的日志消息,并在必要时进行解析和转换。
概述
syslog-ng 根据定义的“源”接收传入的日志消息,并根据强大的“过滤器”指令将其转发到适当的“目标”。在典型的简单设置中,syslog-ng 将从三个源读取消息:
- 默认的
/dev/log设备,大多数日志都发送到这里 - syslog-ng 的“内部”日志消息
/proc/kmsg内核消息
源使用“source”指令定义。这些传入的消息然后根据定义的过滤器(“filter”关键字)进行过滤,例如根据原始程序或日志级别,并发送到适当的“destination”。
目标包括日志文件(例如 /var/log/messages.log)、在控制台打印消息以及远程服务器。
关键功能是 log。此功能定义了应将哪些过滤器应用于特定源,以及结果消息应发送到何处。
除了上述本地源之外,syslog-ng 还可以在网络上处理各种源。要使用它们,您需要创建 network() 或 udp() 或 tcp() 源,如下所述。
安装
安装 syslog-ng 包。
要使用 syslog-ng,请 启动/启用 syslog-ng@default.service。
systemd/journald 集成
syslog-ng 默认会拉取 systemd journal 中的消息。建议在 /etc/systemd/journald.conf 中将 ForwardToSyslog=no 设置为 no,以避免与套接字相关的开销,并避免在日志中出现不必要的错误消息。另一方面,如果您不想存储两次日志并关闭 journald 的 Storage=none,则必须设置 ForwardToSyslog=yes,因为 syslog-ng 会尝试跟随 'journald' journal 文件。
有关更多详细信息,请参阅 #syslog-ng 和 systemd journal。
源
syslog-ng 从源接收日志消息。要定义源,您应遵循以下语法:
source <identifier> { source-driver(params); source-driver(params); ... };
在最简单的情况下,您只需要一个 system() 驱动程序。
source src { system(); };
这将自动检测收集本地日志的最佳方式,并确保收集 syslog-ng 的内核、应用程序和内部日志。
您可以在 其他 syslog-ng 手册中查找标识符和源驱动程序(因为 syslog-ng.com 上的那些无法访问)。
system() 驱动程序实际上是一个更高级别的构造,它根据本地系统的需要扩展到各种源。但是,您可以通过删除 system() 源并直接使用更低级别的驱动程序来获得更多控制。
unix-stream() 源驱动程序会打开指定的 AF_UNIX 套接字并开始监听其中的消息。
internal() 源驱动程序“接收”由 syslog-ng 本身生成的内部消息。
因此,以下意味着:src 从 /dev/log 套接字和 syslog-ng 获取消息。
source src { unix-stream("/dev/log"); internal(); };
内核将日志消息发送到 /proc/kmsg,而 file() 驱动程序从文件中读取日志消息。因此,以下意味着 kernsrc 从文件 /proc/kmsg 获取消息。
source kernsrc { file("/proc/kmsg"); };
要打开一个端口以从远程服务器读取数据,必须使用此语法定义源:
source s_net { network(transport(tcp)); };
用于 UDP,或
source s_net { network(transport(udp)); };
通过 TCP 接收日志消息。两者都监听端口 514,除非通过 port() 参数覆盖。
syslog-ng 和 systemd journal
从 syslog-ng 版本 3.6.1 开始,在支持 systemd 的 Linux 系统上,默认的 system() 源使用 journald 作为其标准的 system() 源。
如果您希望同时使用 journald 和 syslog-ng,请确保以下设置生效。对于 systemd-journald,在 /etc/systemd/journald.conf 文件中,将 Storage= 设置为 auto 或留空(默认为 auto),并将 ForwardToSyslog= 设置为 yes。对于 /etc/syslog-ng/syslog-ng.conf,您需要以下 source 块:
/etc/syslog-ng/syslog-ng.conf
source src {
system();
};
另一方面,如果您不希望保留 journald 日志,而只希望保留 syslog-ng 的文本日志,请在 /etc/systemd/journald.conf 中将 Storage=volatile 设置为 volatile。这将把 journald 存储在内存中。从 syslog-ng 3.6.3 开始,syslog-ng 将 journald 用作 system(); 源,因此如果您将 Storage=none 设置为 none,systemd journal 将丢弃所有消息,不会将其转发给 syslog-ng。
更改后,请 重启 systemd-journald.service 和 syslog-ng@default.service 守护进程。
目标
在 syslog-ng 中,日志消息被发送到文件。语法与源非常相似:
destination <identifier> {destination-driver(params); destination-driver(params); ... };
您通常会记录到文件,但您也可以记录到不同的目标驱动程序:管道、Unix 套接字、TCP-UDP 端口、终端或特定程序。仅声明一个目标不会导致消息传递到该目标:只有当您使用 log 语句连接源和目标时才会发生。Log 语句还可以包含过滤器,从而实现灵活的日志路由功能。
此声明指示 syslog-ng 将消息发送到 /var/log/auth.log。
destination authlog { file("/var/log/auth.log"); };
如果用户已登录,usertty() 会将消息发送到指定用户的终端。如果您想将控制台消息发送到 root 的终端(如果已登录):
destination console { usertty("root"); };
消息可以通过 pipe() 发送到管道。以下是将 xconsole 消息发送到管道 /dev/xconsole。这需要更多配置,因此您可以查看下面的 xconsole 子节。
destination xconsole { pipe("/dev/xconsole"); };
要将消息发送到网络,请使用 udp()。以下会将您的日志数据发送到另一台服务器。
destination remote_server { udp("10.0.0.2" port(514)); };
您也可以使用较新的 network() 驱动程序语法来实现相同的功能:
destination remote_server { network("10.0.0.2" port(514) transport(udp)); };
创建消息过滤器
filter 语句的语法是:
filter <identifier> { expression; };
表达式中可以使用函数,例如 facility() 函数,它根据 syslog facility 代码(kern、mail、auth 等)选择消息。除了 facility 代码之外,每条日志消息都与一个 severity 值相关联;其中 debug 是最详细的,panic 只显示严重错误。您可以在 /usr/include/sys/syslog.h 或 RFC 3164 中找到 facility、log 级别和 priority 名称。要过滤来自授权的消息,例如 su(pam_unix)[18569]: session opened for user root by (uid=1000),请使用以下方法:
filter f_auth { facility(auth); };
facility 表达式可以使用布尔运算符 and、or 和 not,因此以下过滤器选择不来自授权、网络新闻或邮件的消息:
filter f_debug { not facility(auth, authpriv, news, mail); };
severity() 函数根据 severity 级别选择消息,因此如果您想选择 informational 级别:
filter f_info { severity(info); };
函数和布尔运算符可以组合成更复杂的表达式。以下行过滤来自 informational 到 warning 级别的消息,这些消息不来自 auth、authpriv、mail 和 news facility:
filter f_messages { severity(info..warn) and not facility(auth, authpriv, mail, news); };
还可以通过将消息与函数 match("regex" value("<macro>")) 中的正则表达式进行匹配来选择消息。例如,这将匹配正则表达式“failed”的消息主体:
filter f_failed { match("failed" value("MESSAGE")); };
在过滤器表达式中,您可以使用预定义和用户定义的宏。这些也被称为“硬”宏和“软”宏,分别。
您可以在 syslog-ng 文档中找到所有宏的列表和文档。
"AMPM", "BSDTAG", "DATE, C_DATE, R_DATE, S_DATE", "DAY, C_DAY, R_DAY, S_DAY", "FACILITY", "FACILITY_NUM", "FULLDATE, C_FULLDATE, R_FULLDATE, S_FULLDATE", "FULLHOST", "FULLHOST_FROM", "HOUR, C_HOUR, R_HOUR, S_HOUR", "HOUR12, C_HOUR12, R_HOUR12, S_HOUR12", "HOST", "HOST_FROM", "ISODATE, C_ISODATE, R_ISODATE, S_ISODATE", "LEVEL_NUM", "LOGHOST", "MIN, C_MIN, R_MIN, S_MIN", "MONTH, C_MONTH, R_MONTH, S_MONTH", "MONTH_ABBREV, C_MONTH_ABBREV, R_MONTH_ABBREV, S_MONTH_ABBREV", "MONTH_NAME, C_MONTH_NAME, R_MONTH_NAME, S_MONTH_NAME", "MONTH_WEEK, C_MONTH_WEEK, R_MONTH_WEEK, S_MONTH_WEEK", "MSEC, C_MSEC, R_MSEC, S_MSEC", "MSG or MESSAGE", "MSGHDR", "MSGID", "MSGONLY", "PID", "PRI", "PRIORITY or LEVEL", "PROGRAM", "SDATA, .SDATA.SDID.SDNAME", "SEC, C_SEC, R_SEC, S_SEC", "SOURCEIP", "SEQNUM", "STAMP, R_STAMP, S_STAMP", "SYSUPTIME", "TAG", "TAGS", "TZ, C_TZ, R_TZ, S_TZ", "TZOFFSET, C_TZOFFSET, R_TZOFFSET, S_TZOFFSET", "UNIXTIME, C_UNIXTIME, R_UNIXTIME, S_UNIXTIME", "USEC, C_USEC, R_USEC, S_USEC", "YEAR, C_YEAR, R_YEAR, S_YEAR", "WEEK, C_WEEK, R_WEEK, S_WEEK", "WEEK_ABBREV, C_WEEK_ABBREV, R_WEEK_ABBREV, S_WEEK_ABBREV", "WEEK_DAY, C_WEEK_DAY, R_WEEK_DAY, S_WEEK_DAY", "WEEKDAY, C_WEEKDAY, R_WEEKDAY, S_WEEKDAY", "WEEK_DAY_NAME, C_WEEK_DAY_NAME, R_WEEK_DAY_NAME, S_WEEK_DAY_NAME".
要过滤来自特定远程主机(根据传入消息本身声明,而不是通过其 IP 地址)的消息,必须使用 host() 函数:
filter f_host { host( "192.168.1.1" ); };
如果您宁愿基于发送 IP 地址过滤,您可以使用 netmask() 过滤器:
filter f_ipaddr { netmask( "192.168.1.1/32" ); };
日志路径
syslog-ng 使用 log 语句连接源、过滤器和目标。语法是:
log {source(s1); source(s2); ...
filter(f1); filter(f2); ...
destination(d1); destination(d2); ...
flags(flag1[, flag2...]); };
例如,以下是将消息从 src 源发送到 mailinfo 目标,并使用 f_info 过滤器进行过滤:
log { source(src); filter(f_mail); filter(f_info); destination(mailinfo); };
Log 语句描述了一个管道:它告诉 syslog-ng 从一个或多个源获取消息,并将它们传递给一个或多个目标,前提是相关的过滤器匹配。
如果您有多个 log 语句从同一源获取消息,消息将 along with all of those pipelines 被复制。当然,您可以应用一套不同的过滤器,从而选择性地将消息路由到多个目标。
除了过滤之外,syslog-ng 还可以应用消息的解析或重写。解析意味着从消息文本中提取信息,而重写消息意味着 syslog-ng 可以根据需要更改/重新格式化消息。
log 语句还有更多功能:
- 您可以使用 flags(final) 在当前 log 路径匹配后停止处理后续的 log 路径。
- 您可以使用 flags(fallback) 让 log 语句捕获其他 log 语句未捕获的消息。
- 您可以通过使用嵌入式 log 语句和连接来创建任意的 log 管道图,这有助于您构建复杂的处理管道。
您可以在 syslog-ng 文档的章节中阅读有关 log 语句的更多信息。
技巧与提示
在理解了 syslog-ng 的逻辑后,许多可能的复杂配置都是可行的。这里有一些例子。
让 syslog-ng 重新加载配置文件
您可以让 syslog-ng 重新评估配置文件。您可以手动向进程发送 SIGHUP 信号,或者 重新加载 syslog-ng@default.service。
故障转移日志记录到远程主机
此设置展示了如何使用标准端口 (514) 和备用端口,通过 TCP 和 UDP 协议发送未加密的默认 syslog 数据包。这是以 4 种不同的方式将相同的输出发送到同一台机器,以尝试确保数据包能够送达。主要在调试无法重启的远程服务器时有用。不同的端口和协议是为了绕过任何防火墙过滤器或其他网络问题。也适用于端口转发和使用隧道。类似于此设置的配置非常适合通过容易出现故障转移的主机通过反向连接发起的 ssh 连接进行隧道传输。
#sending to a remote syslog server on TCP and UDP ports (not encrypted)
destination askapache_failover_loghost {
tcp("208.86.158.195" port(25214));
udp("208.86.158.195" port(25214));
udp("mysyslog1.dyndns.org" port(514));
};
log {
source(src);
destination(askapache_failover_loghost);
};
然后在接收这些日志的日志主机上:
#a USB redirected console for flexible viewing
destination debugging_console {
file("/dev/ttyU1");
};
# listens on IP addresses and ports, sets the incoming settings
source prone_to_failover_host {
tcp(ip(208.86.158.195),port(25214));
udp(ip(208.86.158.195) port(25214));
udp(default-facility(syslog) default-priority(emerg));
tcp(default-facility(syslog) default-priority(emerg));
}
# log it
log {
source(prone_to_failover_host);
destination(debugging_console);
};
将日志移动到另一个文件
为了将某些日志从 /var/log/messages 移动到另一个文件:
#sshd configuration
destination ssh { file("/var/log/ssh.log"); };
filter f_ssh { program("sshd"); };
log { source(src); filter(f_ssh); destination(ssh); flags(final); };
确保在您的常规 log 语句之前添加此块。由于 log 语句中的 flags(final),任何匹配“sshd”过滤器的内容都将仅发送到 ssh.log,并且消息的处理将在该点停止。
配置为日志主机
配置您的系统作为日志主机非常简单。将以下内容放入您的配置中,并创建所需的目录。通过这个简单的配置,日志文件名将基于远程主机的 FQDN,并位于 /var/log/remote/ 目录下。创建远程目录后,重新加载您的 syslog-ng 配置。
source net { udp(); };
destination remote { file("/var/log/remote/${FULLHOST}-log"); };
log { source(net); destination(remote); };
您还可以考虑使用 default-network-drivers() 源,它将打开多个端口,接受来自现场通常部署的多种不同 syslog 协议的消息。
提高性能
syslog-ng 的性能可以通过多种方式提高:
定期写入
看来旧的 sync(X) 选项现在称为 flush_lines(X),其中写入文件被缓冲 X 行。默认值为 100。
增加源批处理限制
syslog-ng 以并行方式进行消息处理,因为消息流通过许多不同的源机制接收。为了避免一个源连接饿死另一个源,syslog-ng 使用线程并限制一次从单个源连接处理的消息量。
这意味着,即使源应用程序可能在紧密的循环中发送了 1000 条消息,syslog-ng 也将一次处理 100 条(确切限制由 log-fetch-limit() 指定),并且在每 100 条消息之后,它会重新检查其他连接是否也需要处理。这有一些开销,通过增加 log-fetch-limit() 可以显着提高 syslog-ng 的性能。
另一个可以根据特定用例进行调整的机制是用于反压传播的窗口大小设置。这是 log-iw-size() 参数,它控制在目标确认消息之前有多少消息处于“飞行中”。通过增加 log-iw-size(),您可以让它处理更多消息,然后才会停止以允许目标消耗消息。
增加 log-iw-size() 会增加您的内存/磁盘缓冲区使用量,因为 syslog-ng 将不得不将消息放在某个地方。
避免重复处理和磁盘空间占用
一条日志消息可能被多次发送到不同的日志文件。例如,在初始配置文件中,我们有以下定义:
destination cron { file("/var/log/cron.log"); };
destination messages { file("/var/log/messages"); };
filter f_cron { facility(cron); };
filter f_messages { level(info..warn)
and not facility(auth, authpriv, mail, news); };
log { source(src); filter(f_cron); destination(cron); };
log { source(src); filter(f_messages); destination(messages); };
来自 cron facility 的相同消息将同时出现在 cron.log 和 messages 文件中。要更改此行为,我们可以使用 final 标志,结束消息的进一步处理。因此,在此示例中,如果我们希望来自 cron facility 的消息不出现在 messages 文件中,我们应该通过以下方式修改 cron 的 log 语句:
log { source(src); filter(f_cron); destination(cron); flags(final); };
另一种方法是从 f_messages 过滤器中排除 cron facility:
filter f_messages { level(info..warn) and not facility(cron, auth, authpriv, mail, news); };
PostgreSQL 目标
本节将使用两个角色:syslog 和 logwriter。syslog 将是 syslog 数据库的管理员,而 logwriter 将只能向 logs 表添加记录。
不再需要为日志创建表。syslog-ng 将自动创建。
psql -U postgres
postgres=# CREATE ROLE syslog WITH LOGIN; postgres=# \password syslog # Using the \password function is secure because postgres=# CREATE ROLE logwriter WITH LOGIN; postgres=# \password logwriter # the password is not saved in history. postgres=# CREATE DATABASE syslog OWNER syslog; postgres=# \q # You are done here for the moment
编辑 pg_hba.conf 以允许 syslog 和 logwriter 建立与 PostgreSQL 的连接。
/var/lib/postgres/data/pg_hba.conf
# TYPE DATABASE USER CIDR-ADDRESS METHOD host syslog logwriter 192.168.0.1/24 md5 host syslog syslog 192.168.0.10/32 md5
然后 重新加载 postgresql.service。
编辑 /etc/syslog-ng/syslog-ng.conf,使其知道在哪里以及如何写入 PostgreSQL。syslog-ng 将利用 logwriter 角色。
...
#
# SQL logging support
#
destination d_pgsql {
sql(type(pgsql)
host("127.0.0.1") username("logwriter") password("password")
database("syslog")
table("logs_${HOST}_${R_YEAR}${R_MONTH}${R_DAY}") #or whatever you want, example ${HOST}" for hosts, ${LEVEL}" for levels.. etc
columns("datetime timestamp with time zone", "host varchar(32)", "program varchar(16)", "pid varchar(16)", "message varchar(200)")
values("$R_ISODATE", "$HOST", "$PROGRAM", "$PID", "$MSG")
indexes("datetime", "host", "program", "pid", "message"));
};
log { source(src); destination(d_pgsql); };
最后,重启 syslog-ng.service。
然后检查是否正在记录内容。
psql -U logwriter -d syslog syslog=> SELECT * FROM <your table name> ORDER BY datetime DESC LIMIT 10;
ISO 8601 时间戳
之前 :
#logger These timestamps are not optimal. #tail -n 1 /var/log/messages.log Feb 18 14:25:01 hostname logger: These timestamps are not optimal. #
在 options 部分的 /etc/syslog-ng/syslog-ng.conf 中添加 ts_format(iso);。示例:
options {
stats_freq (0);
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);
perm(0640);
group("log");
ts_format(iso); #make ISO-8601 timestamps
#frac-digits(3); #optional time to nearest millisecond
};
然后 重新加载 syslog-ng.service。
之后 :
#logger Now THAT is a timestamp! #tail -n 2 /var/log/messages.log Feb 18 14:25:01 hostname logger: These timestamps are not optimal. 2010-02-18T20:23:58-05:00 electron logger: Now THAT is a timestamp! #
RFC 3339 时间戳
与上面相同,只是将 ts_format 的 iso 替换为 rfc3339。
日志级别
日志级别在 syslog-ng 配置中为每个日志 facility 单独定义。可用日志级别在 /usr/include/sys/syslog.h 中列出。
/usr/include/sys/syslog.h
define LOG_EMERG 0 /* system is unusable */ define LOG_ALERT 1 /* action must be taken immediately */ define LOG_CRIT 2 /* critical conditions */ define LOG_ERR 3 /* error conditions */ define LOG_WARNING 4 /* warning conditions */ define LOG_NOTICE 5 /* normal but significant condition */ define LOG_INFO 6 /* informational */ define LOG_DEBUG 7 /* debug-level messages */
宏和变量
宏可以在模板和目标文件名中使用。syslog-ng OSE 的宏。
以下代码将以 macroname=value@ 的格式将日志行写入 /var/log/test.log。
template t_test { template("PROGRAM=$PROGRAM@PID=$PID@BSDTAG=$BSDTAG@TAG=$TAG@TAGS=$TAGS@FACILITY=$FACILITY@FACILITY_NUM=$FACILITY_NUM@LEVEL=$LEVEL@LEVEL_NUM=$LEVEL_NUM@PRI=$PRI@PRIORITY=$PRIORITY@FULLHOST=$FULLHOST@FULLHOST_FROM=$FULLHOST_FROM@HOST=$HOST@HOST_FROM=$HOST_FROM@LOGHOST=$LOGHOST@MSGHDR=$MSGHDR@MSGID=$MSGID@MSGONLY=$MSGONLY@MSG=$MSG@MESSAGE=$MESSAGE@SOURCE=$SOURCE@SOURCEIP=$SOURCEIP@SOURCE_IP=$SOURCE_IP@SEQNUM=$SEQNUM@UNIXTIME=$UNIXTIME@FULLDATE=$FULLDATE@ISODATE=$ISODATE@DATE=$DATE@STAMP=$STAMP@TZ=$TZ@TZOFFSET=$TZOFFSET@SEC=$SEC@MIN=$MIN@HOUR=$HOUR@HOUR12=$HOUR12@DAY=$DAY@WEEK=$WEEK@WEEK_DAY=$WEEK_DAY@WEEK_DAY_ABBREV=$WEEK_DAY_ABBREV@WEEK_DAY_NAME=$WEEK_DAY_NAME@MONTH=$MONTH@MONTH_ABBREV=$MONTH_ABBREV@MONTH_NAME=$MONTH_NAME@MONTH_WEEK=$MONTH_WEEK@YEAR=$YEAR@YEAR_DAY=$YEAR_DAY
\n"); template_escape(no); };
destination d_test { file("/var/log/test.log" template(t_test)); };
log { source(s_local); destination(d_test); flags(final); };
在重启 syslog-ng 后,您可以通过以下方式创建自己的值列表:tail /var/log/test.log|tr "@" "\n"
PROGRAM=kernel PID= BSDTAG=4A TAG=04 TAGS=.source.s_local FACILITY=kern FACILITY_NUM=0 LEVEL=warning LEVEL_NUM=4 PRI=4 PRIORITY=warning FULLHOST=www.askapache.com FULLHOST_FROM=www.askapache.com HOST=www.askapache.com HOST_FROM=www.askapache.com LOGHOST= MSGHDR=kernel: MSGID= MSGONLY=Firewall: *INVALID* IN=eth0 OUT= MAC=00:00 SRC=x.x.x.x DST=198.101.159.98 LEN=40 TOS=0x00 PREC=0x00 TTL=113 ID=7730 DF PROTO=TCP SPT=52369 DPT=80 WINDOW=0 RES=0x00 ACK RST URGP=0 MSG=Firewall: *INVALID* IN=eth0 OUT= MAC=00:00 SRC=x.x.x.x DST=198.101.159.98 LEN=40 TOS=0x00 PREC=0x00 TTL=113 ID=7730 DF PROTO=TCP SPT=52369 DPT=80 WINDOW=0 RES=0x00 ACK RST URGP=0 MESSAGE=Firewall: *INVALID* IN=eth0 OUT= MAC=00:00 SRC=x.x.x.x DST=198.101.159.98 LEN=40 TOS=0x00 PREC=0x00 TTL=113 ID=7730 DF PROTO=TCP SPT=52369 DPT=80 WINDOW=0 RES=0x00 ACK RST URGP=0 SOURCE=s_local SOURCEIP=127.0.0.1 SOURCE_IP= UNIXTIME=1369742458 FULLDATE=2013 May 28 08:00:58 ISODATE=2013-05-28T08:00:58-04:00 DATE=May 28 08:00:58 STAMP=2013-05-28T08:00:58-04:00 TZ=-04:00 TZOFFSET=-04:00 SEC=58 MIN=00 HOUR=08 HOUR12= DAY=28 WEEK=21 WEEK_DAY=3 WEEK_DAY_ABBREV=Tue WEEK_DAY_NAME=Tuesday MONTH=05 MONTH_ABBREV=May MONTH_NAME=May MONTH_WEEK=4 YEAR=2013 YEAR_DAY=148
接收和解析常见的 syslog 消息
从版本 3.16 开始,syslog-ng 能够使用 default-network-drivers() 源驱动程序在最常见的端口上使用最常见的解析器接收和解析消息。
- 默认监听端口
- 514,TCP 和 UDP,用于 RFC3164 (BSD-syslog) 格式的流量
- 601 TCP,用于 RFC5424 (IETF-syslog) 格式的流量
- 6514 TCP,用于 TLS 加密流量
- 自动解析器
另请参阅
- Netconsole 一个内核模块,它通过网络将所有内核日志消息(例如 dmesg)发送到另一台计算机,而无需涉及用户空间(例如 syslogd)。
外部链接
- GitHub 上的 syslog-ng 项目页面
- syslog-ng.com 上的 syslog-ng OSE 主页
- syslog-ng 文档
- syslog-ng 文档 GitHub 页面
- syslog-ng 博客
- Axoflow 关于 syslog-ng 的博客
- Freecode 上的 syslog-ng 项目页面
- Gentoo:syslog-ng
- Gentoo:Security Handbook/Logging
- 什么是 Syslog?使用 PostgreSQL 进行日志记录 HOWTO
- Wikipedia:ISO 8601
- RFC 3164 - BSD syslog 协议
- RFC 5424 - Syslog 协议
- RFC 3339 - Internet 上的日期和时间:时间戳