syslog总结
大概
- syslog基础知识&概念
- syslog配置
- 日志写入方式
syslog基础知识&概念
Unix/Linux系统中的大部分日志都是通过一种叫做syslog的机制产生和维护的。syslog是一种标准的协议,分为客户端和服务器端,客户端是产生日志消息的一方,而服务器端负责接收客户端发送来的日志消息,并做出保存到特定的日志文件中或者其他方式的处理
在Linux中,常见的syslog服务器端程序是syslogd守护程序。这个程序可以从三个地方接收日志消息:
-
1)Unix域套接字 /dev/log;
lrwxrwxrwx 1 root root 28 Jan 4 01:37 log -> /run/systemd/journal/dev-log=
-
2)UDP端口514;
-
3)特殊的设备/dev/klog(读取内核发出的消息)。
相应地,产生日志消息的程序就需要通过上述三种方式写入消息,对于大多数程序而言就是向/dev/log这个套接字发送日志消息
syslog是Linux系统默认的日志守护进程。默认的主配置文件和辅助配置文件分别是/etc/rsyslog.conf和/etc/sysconfig/syslog文件。
通常,syslog 接受来自系统的各种功能的信息,每个信息都包括重要级。/etc/syslog.conf 文件通知 syslogd 如何根据设备和信息重要级别来报告信息。
在Linux中经常用到ssh远程登录,Linux系统的登录,操作系统计划任务crond和at进程都会产生一系列的消息,并且发送到rsyslog守护进程,再由rsyslog守护进程写入不同的日志文件中
logger 命名
syslog实现
syslogd
这是最传统的syslog协议服务器端的实现,运行于大多数的Linux系统中。由于其安全性差、语法太自由而导致了很多的问题,目前有了一些替代品出现。
rsyslogd
-
- 后端存查日志支持的客户端多。
-
- 在同一台机器上支持多直rsyslogd进程,可以监听在不同端口。
-
- 直接兼容系统自带的syslog.conf 配置文件。
-
- 可将消息过滤后再次转发。
-
- 配置文件中可以写简单的逻辑判断
-
- 有现成的前端web展示程序
现在RHEL以及CentOS都已经把rsyslog作为默认的syslog安装,不再使用syslogd了。
syslog-ng
也就是(next generation)下一代syslog,也是用来代替传统syslogd的,不开放源代码
syslog配置
简单配置使用syslog
使用 systemctl status syslog.service 查看syslog服务启动情况
默认并未开启tcp udp 接收日志消息需要修改配置
vi /etc/rsyslog.conf 修改默认配置 支持 tcp udp
ubuntu 配置文件修改
修改完成后 重启syslog.service
systemctl restart syslog.service #重启服务
测试连通性
nc -vuz 192.168.0.54 514
查看日志
ubuntu下 使用 tail -f /var/log/syslog 可以查看收到的日志
配置syslog
ubuntu centos
- /etc/rsyslog.d
- /etc/rsyslog.conf 配置文件
修改/etc/rsyslog.conf 可以配置日志打印位置日志各式以及不同类型日志
基本语法
** 类型.(* ! =)级别 [;类型.(* ! =)级别] 动作 **
类型(Facility)
facility参数syslog.conf中对应的Facility取值
java syslg4j中可以配置
syslog.getConfig().setFacility(facility);
可以使用的Facility取值:
- kern 内核产出的日志
- mail 邮件产出的日志
- daemon 一些守护进程产出的日志
- auth 用户认证时产生的日志
- syslog 系统日志
- lpr 打印相关活动
- news 网络新闻传输协议(nntp)
- uucp Unix-to-Uinx 两个unix之间的相关通信
- cron linux 定时任务
- authpriv ssh,ftp登录信息的验证日志
- ftp ftp产生的日志
- mark 服务内部的信息,时间表示
- local0~local7 自定义日志
级别(Severity)
priority参数
syslog.conf中对应的级别取值
- emerg 紧急情况,需要立即通知技术人员 数字代码0
- alert 应该被立即改正的问题,如系统数据库被破坏,ISP连接丢失 数字代码1
- crit 重要情况,如硬盘错误,备用连接丢失 数字代码2
- err 错误,不是非常紧急,在一定时间内修复即可。 数字代码3
- warning 警告信息,不是错误,比如系统磁盘使用了85%等。 数字代码4
- notice 不是错误情况,也不需要立即处理。 数字代码5
- info 情报信息,正常的系统消息,比如骚扰报告,带宽数据等,不需要处理。数字代码6
- debug 包含详细的开发情报的信息,通常只在调试一个程序时使用。 数字代码7
动作
动作域指示信息发送的目的地可以是:
- filename (日志文件)
- @host (远程主机)
- user1,user2 (指定用户)
filename 日志文件
由绝对路径指出的文件名,此文件必须事先建立; 如果在文件名之前加上减号(-),则表示不将日志信息同步刷新到磁盘上(使用写入缓存),这样可以提高日志写入性能,但是增加了系统崩溃后丢失日志的风险。
@host 远程主机
@符号后面可以是ip,也可以是域名,默认在/etc/hosts文件下loghost这个别名已经指定给了本机。
user1,user2 指定用户
如果指定用户已登录,那么他们将收到信息; *所有用户。所有已登录的用户都将收到信息。
配置例子
各式 类型.(* ! =)级别 [;类型.(* ! =)级别] 动作
# 记录kern所有日志 (类型.* 表示等于所有级别)
kern.* /var/log/kern.log
# 记录mail所有等级为warn级别的日志(类型.=级别 表示等于指定级别)
mail.=warn /var/log/mail_err.log
# 记录mail日志等级为error及以上日志 (类型.级别 表示大于等于指定级别)
mail.err /var/log/mail_err.log
# 将mail的所有信息,除了info以外,其他的都写入/var/log/mail
# (注意使用; 分割多个配置 使用!= 表示排除)
mail.*;mail.!=info /var/log/mail
# 将日志等级为crit或更高的内核消息定向到远程主机jim
# 如果主机崩溃,磁盘出现不可修复的错误,可能无法读取存储的消息。如果有日志在远程主机上,可以尝试找出崩溃的原因。
kern.crit @jim
# 记录所有类型的warning等级及以上日志
*.warning /var/log/syslog_warn.log
# 记录mail的大于warning日志和kern大于的error日志,其他所有的info日志
*.info;mail.warning;kern.error /var/log/messages
# 记录kernel的info到warning日志
kern.info;kern.!err /var/adm/kernel-info
# 将mail和news的info级别日志写入/var/log/info
mail,news.=info /var/log/info
# 将所有系统中所有类型的info日志和notice日志存入/var/log/massages,mail的所有日志除外。
*.=info;*.=notice;\
mail.none /var/log/messages
# 紧急消息(emerg级别)将使用wall显示给当前所有登录的用户
*.=emerg *
# 该规则将所有alert以及更高级别的消息定向到操作员的终端,即登录的用户“root”和“esuser”的终端。
*.alert root,esuser
配置日志各式
rsyslog 模板元素属性
rsyslog 与时间相关的属性
例如:
vim /etc/rsyslog.conf
# 创建一个名为my_format的模板,其中 TIMESTAMP:8:15 表示timestamp属性值切片第八位到第十五位。
$template my_format, "%$NOW% %TIMESTAMP:8:15% [%hostname%]:[%fromhost-ip%] %syslogseverity-text% %syslogtag% %msg%\n"
$ActionFileDefaultTemplate my_format
systemctl restart syslog.service #重启rsyslog
日志输出各式已经改变
日志写入方式
使用java syslog4j 写入
step1 添加maven依赖
<dependency>
<groupId>org.graylog2</groupId>
<artifactId>syslog4j</artifactId>
<version>0.9.60</version>
</dependency>
step2 代码说明
package com.my.study.th3.syslog.base;
import java.util.Date;
import org.graylog2.syslog4j.Syslog;
import org.graylog2.syslog4j.SyslogConstants;
import org.graylog2.syslog4j.SyslogIF;
public class SysLogTest1 {
// 启动了syslog 服务的 linux服务器地址 注意需要提前配置开启 tcp 或者 udp
// vi /etc/rsyslog.conf
private static final String HOST = "192.168.0.54";
// 指定端口 默认514
private static final int PORT = 514;
/**
* 测试基础使用
*/
public void test1() {
System.out.println("syslog version: " + Syslog.getVersion());
// 获取syslog的操作类,使用udp协议。syslog支持"udp", "tcp", "unix_syslog",
// "unix_socket"协议
SyslogIF syslog = Syslog.getInstance(SyslogConstants.UDP);
// SyslogIF syslog = Syslog.getInstance(SyslogConstants.TCP);
// 配置
syslog.getConfig().setSendLocalName(true); // 是否发送主机名
syslog.getConfig().setLocalName("liuyijiang-host");
syslog.getConfig().setIdent("my-syslog-test"); // 日志识别 可以配置为项目的名称
syslog.getConfig().setCharSet("utf-8");
/**
* facility 消息类型,指定 syslog 功能,主要包括
* 配置日志写入的设备 即: 写入到哪个文件中 注意需要在配置文件中配置才行 /etc/rsyslog.conf
*
* kern 内核信息,首先通过 klogd 传递
* lpr 打印信息;
* mail 邮件日志
* uucp 由uucp生成的信息
* cron 计划任务日志
* syslog 系统日志;
* authpriv 用户认证时产生的日志,如login命令、su命令
* local0-local7 由自定义程序时使用
* news 网络新闻传输协议(nntp)产生的消息
* user 用户进程
* daemon 某些守护进程
* mark syslog 内部功能用于生成时间戳
*/
// String facility = "kern"; //日志写入到 /var/log/kern.log
//String facility = "mail"; // 日志写入到 /var/log/mail.log
//local2的配置 注意这里需要在 /etc/rsyslog.conf 文件下添加如下配置
//local2.err;local2.!=alert -/var/log/local2.log
String facility = "local2";
syslog.getConfig().setFacility(facility); //不配置则写入到默认 /var/log/syslog
syslog.getConfig().setHost(HOST);
syslog.getConfig().setPort(PORT);
/**
* 发送信息到服务器,2表示日志级别 范围为0~7的数字编码,表示了事件的严重程度。 0最高,7最低
* syslog为每个事件赋予几个不同的优先级:
* 0 LOG_EMERG:紧急情况,需要立即通知技术人员。
* 1 LOG_ALERT:应该被立即改正的问题,如系统数据库被破坏,ISP连接丢失。
* 2 LOG_CRIT:重要情况,如硬盘错误,备用连接丢失。
* 3 LOG_ERR:错误,不是非常紧急,在一定时间内修复即可。
* 4 LOG_WARNING:警告信息,不是错误,比如系统磁盘使用了85%等。
* 5 LOG_NOTICE:不是错误情况,也不需要立即处理。
* 6 LOG_INFO:情报信息,正常的系统消息,比如骚扰报告,带宽数据等,不需要处理。
* 7 LOG_DEBUG:包含详细的开发情报的信息,通常只在调试一个程序时使用。
*/
int level = 0;
syslog.log(level, "这是第一条syslog 日志 -timestemp:" + System.currentTimeMillis());
syslog.log(level, "这是第一条syslog 日志 -time:", new Date());
syslog.alert("这是this is alert "); //这条日志不会输入到/var/log/local2.log
syslog.critical("这是this is critical"); //这条日志不会输入到/var/log/local2.log
syslog.debug("这是this is debug "); //这条日志不会输入到/var/log/local2.log
syslog.error("这是this is error "); //这条日志不会输入到/var/log/local2.log
syslog.info("这是this is info "); //这条日志不会输入到/var/log/local2.log
//System.out.println("ok 在ubuntu服务器上 tail -f /var/log/syslog 查看日志");
System.out.println("ok 在ubuntu服务器上 tail -f /var/log/local2.log 查看日志");
}
public static void main(String[] args) {
SysLogTest1 t = new SysLogTest1();
t.test1();
}
}
见 SysLogTest1.java