java syslog4j 写入日志到 linux syslog syslog4j 使用例子

syslog是Unix/Linux系统中用于生成和维护日志的标准协议,分为客户端和服务器端。syslogd是常见的服务器端程序,可以从Unix域套接字、UDP端口和内核设备接收日志。rsyslogd是更现代的实现,支持更多功能和配置选项。文章讨论了syslog的配置,包括日志级别、目的地和过滤规则,并提供了Javasyslog4j库写入日志的示例。
摘要由CSDN通过智能技术生成

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

    1. 后端存查日志支持的客户端多。
    1. 在同一台机器上支持多直rsyslogd进程,可以监听在不同端口。
    1. 直接兼容系统自带的syslog.conf 配置文件。
    1. 可将消息过滤后再次转发。
    1. 配置文件中可以写简单的逻辑判断
    1. 有现成的前端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

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寂寞的4角钱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值