1. syslog协议很简单: syslog发送者发送一小段信息到syslog服务器。接收者一般称为"syslog守护进程"或"syslog服务器"。Logback能向远程syslog守护进程发送消息。实现办法是SyslogAppender。
2. 下面是SyslogAppender的属性
3. 记录事件在syslog里的严重程度是从记录事件的级别转换而来的。DEBUG级别转换为7, INFO是6, WRAN是4, ERROR是3。
4. 由于syslog请求的格式遵循相当严格的规则, 所以SyslogAppender没有用到任何layout。但是, 用"SuffixPattern"选项能显示用户所希望看到的任何信息。
5. 例子
5.1. 新建一个名为SyslogAppender的Java项目, 同时添加相关jar包
5.2. 在src目录下创建logback.xml
<configuration debug="true">
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%-4relative [%thread] %-5level - %msg%n</pattern>
</encoder>
</appender>
<appender name="syslog" class="ch.qos.logback.classic.net.SyslogAppender">
<syslogHost>192.168.25.137</syslogHost>
<facility>LOCAL7</facility>
<port>514</port>
<suffixPattern>%-4relative [%thread] %-5level - %msg</suffixPattern>
</appender>
<root level="debug">
<appender-ref ref="stdout" />
<appender-ref ref="syslog" />
</root>
</configuration>
5.3. 创建Syslog.java
package com.fj;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Syslog {
private static final Logger logger = LoggerFactory.getLogger(Syslog.class);
public static void main(String[] args) {
for(int i = 0; i < 100; i++) {
logger.error("syslog协议很简单: syslog发送者发送一小段信息到syslog服务器。");
logger.warn("接收者一般称为\"syslog守护进程\"或\"syslog服务器\"。");
logger.info("Logback能向远程syslog守护进程发送消息。");
logger.debug("实现办法是SyslogAppender。");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
5.4. 在大多数据的Linux发行版中, rsyslog是一个预先安装的标准日志后台进程。在客户端/服务端的系统配置中, rsyslog能扮演两个角色; 作为一个日志服务器能从其它设备收集日志信息, 而作为一个日志客户端, rsyslog发送自己内部日志信息到远程日志服务器。
5.5. rsyslog守护进程来自于当前的linux发布版本的预装模块, 但是默认并没有启动。为了能够让rsyslog守护进程能够接受外部的消息, 需要编辑其配置文件/etc/rsyslog.conf。
5.6. 打开文件进行编辑, 查找到下面的两行所在的位置, 删除其行首的#字符来取消注释, 这会使得rsysolog守护进程能够在UDP端口514上接受日志消息了, UDP是一种比TCP速度快, 但是并不具有TCP一样的数据流的可靠性。所以如果你需要使用可靠的传送机制, 就可以通过取消以下行的注释。
5.7. 接下来的这步, 需要我们来为远程消息创建模板, 并告知rsyslog守护进程如何记录从其他客户端机器所接受到的消息。还是编辑/etc/rsyslog.conf, 找到GLOBAL DIRECTIVE块, 追加以下的模板
$template RemoteLogs,"/var/log/%HOSTNAME%/logback.log" *
*.* ?RemoteLogs
& ~
5.8. $template RemoteLogs(这里"RemoteLogs"字符串可以为任何其他的描述性的名称)指令使rsyslog后台进程将日志消息写到/var/log下的单独的本地日志文件中, 其中日志文件的名称是基于远程日志发送机器的主机名以及logback.log进行定义的。
5.9. 其中第二行暗示了我们将RemoteLogs模板应用到所有接收到的日志上。
5.10. 符号"& ~"表示了一个重定向规则, 被用来告知rsyslog守护进程停止对日志消息的进一步处理, 并且不要在本地写入。如果没有使用该重定向规则, 那么所有的远程消息都会在写入上述描述的日志文件之外同时被写入到本地日志文件, 这就意味着日志消息实际上被写了两次。使用该规则的另外一个结果就是syslog服务器本身的日志消息只会被以该机器主机名命名的专有文件中。
5.11. 修改后的GLOBAL DIRECTIVE块
5.12. 运行项目, 查看日志文件位置
5.13. 查看日志文件