Log4j2常见使用示例及Syslog/Syslog-ng

013_logback中的SyslogAppender 1. syslog协议很简单: syslog发送者发送一小段信息到syslog服务器。接收者一般称为"syslog守护进程"或"syslog服务器"。Logback能向远程syslog守护进程发送消息。实现办法是SyslogAppender。 2. 下面是SyslogAppender的属性 3. 记录事件在syslog里的严重程度是从记录事件的级别转换而来的。DEBUG级别转换为7, INFO是6, WRAN是4, ERROR是3。 4. 由于syslog请求的格式遵循相当严格的规则, 所以Sys 阅读详情

准备工作

打开http://logging.apache.org/log4j/,点击左侧Download,我下载的是Apache Log4j 2 binary (zip),目前是2.0.2版本。解压后有30几个jar包,大部分是跟兼容性及移植性相关的可选组件,我们要用的是:

log4j-api-2.0.2.jar

log4j-core-2.0.2.jar

  

第一个示例程序

log4j2.xml

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <Configuration status="warn">
 3             <Appenders>
 4                         <Console name="Console" target="SYSTEM_OUT">
 5                                     <PatternLayout pattern="%m%n" />
 6                         </Console>
 7             </Appenders>
 8             <Loggers>
 9                         <Root level="INFO">
10                                     <AppenderRef ref="Console" />
11                         </Root>
12             </Loggers>
13 </Configuration>
复制代码

解释一下Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出。

log4j2配置文件可以使用XML或JSON,似乎 不再支持properties文件了。默认的文件名也有所不同,log4j2.xml,不再是log4j.xml。

log4j2.xml可以放在任意的地方,只要你最后把它放到了classpath里,上面的项目中新建一个resources目录用于放置log4j2.xml,如果在未加入classpath时尝试运行时会报如下错误:

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.

以Eclipse环境为例,可以在Run—Run Configurations对应项目的Classpath中选择User Entries,点击Advanced,选择Add Folder,把resources文件夹添加进来。

Log4jTest.java

复制代码
 1 package mh.sample; 
 2 
 3 import org.apache.logging.log4j.LogManager;
 4 import org.apache.logging.log4j.Logger; 
 5 
 6 public class Log4jTest {    
 7             static Logger log = LogManager.getLogger( Log4jTest.class.getName());
 8 
 9             public static void main(String[] args) {
10                         log.info("This is an info log.");
11                         log.warn("This is a warn log.");
12             }
13 }
复制代码

需要注意的是,log4j2中要用LogManager.get logger,而不是以前的Logger.getLogger

运行此类,可以看到控制台输出两条日志信息:

This is an info log.

This is a warn log.

 通过将配置文件中的level改为”WARN”,可以看到只有一条日志了:

This is a warn log.

关于level的事就这么简单,不多解释了。

 

关于pattern,详见:http://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout

比如常用的是

[%-5p] %d %c - %m%n

如果使用此pattern,输出将类似如下:

[INFO ] 2014-08-29 16:18:15,066 mh.sample.Log4jTest - This is an info log.

[WARN ] 2014-08-29 16:18:15,069 mh.sample.Log4jTest - This is a warn log.

5表示自动将level级别补空格至5个字符

 

第二个示例程序

Log4j2.xml

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <Configuration status="warn">
 3             <Appenders>
 4                         <Console name="Console" target="SYSTEM_OUT">
 5                                     <PatternLayout pattern="[%-5p] %d %c - %m%n" />
 6                         </Console>
 7                         <File name="File" fileName="dist/my.log">
 8                                     <PatternLayout pattern="%m%n" />
 9                         </File>
10             </Appenders>
11 
12             <Loggers>
13                         <Logger name="mh.sample2.Log4jTest2" level="INFO">
14                                     <AppenderRef ref="File" />
15                         </Logger>
16                         <Root level="INFO">
17                                     <AppenderRef ref="Console" />
18                         </Root>
19             </Loggers>
20 </Configuration>
复制代码

在配置文件中我新加了一个Appender,

<File name="File" fileName="dist/my.log">

    <PatternLayout pattern="%m%n" />

</File>

另外,新加了一个Logger,

<Logger name="mh.sample2.Log4jTest2" level="INFO">

    <AppenderRef ref="File" />

</Logger>

Log4jTest.java

复制代码
public class Log4jTest {          

            static Logger log = LogManager.getLogger( Log4jTest.class.getName());

            public static void main(String[] args) {
                        log.info("This is an info log.");
                        log.warn("This is a warn log.");
                        //
                        Log4jTest2 lt2 = new Log4jTest2();
                        lt2.printLog();
            } 
}
复制代码

Log4jTest2.java

复制代码
1 public class Log4jTest2 {           
2 
3             static Logger log = LogManager.getLogger( Log4jTest2.class.getName()); 
4 
5             public void printLog(){
6                         log.info("This is an info log from Log4jTest2.");
7                         log.warn("This is a warn log from Log4jTest2.");
8             }
9 }
复制代码

运行起来,控制台的输出是,

[INFO ] 2014-08-29 17:16:39,899 mh.sample.Log4jTest - This is an info log.

[WARN ] 2014-08-29 17:16:39,901 mh.sample.Log4jTest - This is a warn log.

[INFO ] 2014-08-29 17:16:39,903 mh.sample2.Log4jTest2 - This is an info log from Log4jTest2.

[WARN ] 2014-08-29 17:16:39,904 mh.sample2.Log4jTest2 - This a is warn log from Log4jTest2.

项目下dist/my.log文件中的内容是,

This is an info log from Log4jTest2.

This is a warn log from Log4jTest2.

可以看到,Root总是输出所有。而新添加的logger负责把Log4jTest2中的日志写到指定文件。这个特性有利于在比较大的项目中对日志进行分类。

需要注意的一点是,log4j存在一个“反直觉”的行为,尝试把Root的level改为“WARN”,重新运行,控制台的输出是:

[WARN ] 2014-08-29 17:24:06,788 mh.sample.Log4jTest - This is a warn log.

[INFO ] 2014-08-29 17:24:06,793 mh.sample2.Log4jTest2 - This is an info log from Log4jTest2.

[WARN ] 2014-08-29 17:24:06,794 mh.sample2.Log4jTest2 - This is a warn log from Log4jTest2.

Log4jTest2中的info级别的log还是被输出了,也就是,只要某个logger接受了该log请求,那为作为父亲的Root就会跟着接受此log请求,而不再考虑它的level 

顺带介绍additivity属性,

<Logger name="mh.sample2.Log4jTest2" level="INFO" additivity="false">

作了上面的修改,再运行程序,控制台的输出:

[WARN ] 2014-08-29 17:31:17,388 mh.sample.Log4jTest - This is a warn log.

所以additivity实际上中止了log请求向上级传播,这导致了Log4jTest2中的日志被Logger name="mh.sample2.Log4jTest2" “截留”。

 

常用Appender之RollingFile

Log4j2.xml

复制代码
<Configuration status="warn">
            <Appenders>
                        <Console name="Console" target="SYSTEM_OUT">
                                    <PatternLayout pattern="[%-5p] %d %c - %m%n" />
                        </Console>
                        <File name="File" fileName="dist/my.log">
                                    <PatternLayout pattern="%m%n" />
                        </File>
                        <RollingFile name="RollingFile" fileName="dist/my2.log"

                                    filePattern="dist/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
                                    <PatternLayout pattern="[%-5p] %d %c - %m%n" />
                                    <Policies>
                                                <TimeBasedTriggeringPolicy />
                                                <SizeBasedTriggeringPolicy size="25 KB" />
                                    </Policies>
                                    <DefaultRolloverStrategy max="20"/>
                        </RollingFile>
            </Appenders>
            <Loggers>
                        <Logger name="mh.sample2.Log4jTest2" level="INFO" additivity="false">
                                    <AppenderRef ref="File" />
                                    <AppenderRef ref="RollingFile" />
                        </Logger>
                        <Root level="WARN">
                                    <AppenderRef ref="Console" />
                        </Root>
            </Loggers>
</Configuration>
复制代码

上述RollingFile的配置将把日志内容追加到dist/my2.log文件中,每当大小达到设定的25KB,就会按filePattern的规则备份到dist目录下的子目录中,由于当前是2014年9月3号,该子目录名称是2014-09,里面的文件则是app-09-03-2014-1.log.gz,app-09-03-2014-2.log.gz,app-09-03-2014-3.log.gz,……,从这还可以看出,log4j2自动按你配置的文件名进行gzip压缩。

DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20.

 

常用Appender之Syslog

log4j2中对syslog的简单配置,这里就不重复展示log4j2.xml了:

<Syslog name="SYSLOG" host="localhost" port="514" protocol="UDP" facility="LOCAL3"/>

host是指你将要把日志写到的目标机器,可以是ip(本地ip或远程ip,远程ip在实际项目中很常见,有专门的日志服务器来存储日志),也可以使用主机名,如果是本地,还可以使用localhost或127.0.0.1

Port指定端口,默认514,参见/etc/rsyslog.conf(以Fedora系统为例,下同)。protocol指定传输协议,这里是UDP,facility是可选项,后面可以看到用法,具体关于facility的规则可以点击:http://logging.apache.org/log4j/2.x/manual/appenders.html#SyslogAppender

 

Syslog及Syslog-ng相关配置(Fedora)

在运行程序之前,需要修改

/etc/rsyslog.conf

把这两行前的#去掉,即取消注释:

#$ModLoad imudp

#$UDPServerRun 514

这里启用udp监听,514是默认监听端口,重启syslog:

service syslog restart

大部分日志会默认写到/var/log/messages中,如果不想写到这个文件里,可以按下面修改,这样local3的日志就会写到app.log中。这里的local3即 log4j2.xml中facility的配置。

*.info;mail.none;authpriv.none;cron.none;local3.none                /var/log/messages

新增一行

local3.*                                                                                 /var/log/app.log

 

除了使用自带的syslog,我们也可以使用syslog的替代品,比如syslog-ng,这对于log4j2.xml配置没有影响。

安装:

yum install syslog-ng

启动:

service syslog-ng start

其配置文件为

/etc/syslog-ng/syslog-ng.conf

启动前把source一节中这一行取消注释即可:

#udp(ip(0.0.0.0) port(514));

这个端口会和syslog冲突,可以使用别的端口比如50014,同时修改log4j2.xml中的port属性。另外提一下,使用非默认端口,要求log4j版本在1.2.15或以上。

 

syslog-ng本身也可以设置把日志送到远程机器上,

在源机器上的syslog-ng.conf中添加:

destination d_remote1 { udp(153.65.171.73 port(514));};

这表示源机器上的syslog-ng会把接收到的日志送到远程主机153.65.171.73的514端口上,只要保证153.65.171.73上的syslog-ng正常运行并监听对应的端口即可。

 

Docker 环境下搭建 Syslog-ng 日志服务器 阅读详情

相关推荐

syslog4j-graylog2:Graylog2的syslog4j分支。 从0.10.0开始使用。 原始代码非常“特殊”,没有采取任何措施对其进行改进。 计划在将来的版本中完全替换它

syslog4j Syslog4j提供了BSD Syslog协议(RFC 3164)和“结构化syslog”协议草案(RFC Draft)的客户端和服务器实现。 警告 这是使用的重新打包的fork,因为原始软件包没有发布到Maven Central的最新版本。 已应用一些修改来修复我们遇到的错误。 来自原始源代码 执照 该项目是根据许可的。

Log4j2的DefaultRolloverStrategy详解

当满足条件(日志大小、指定时间等)重命名或打包原日志文件进行归档,生成新日志文件用于日志写入。设置后,假如10点的日志开始重启服务,则从11点触发一次rollover操作,生成。设置后,假如10点的日志开始重启服务,则从11点触发一次rollover操作,生成。然后,每间隔6小时,则下一次是17点触发一次,生成。然后,每间隔6小时,则下一次是17点触发一次,生成。格式对该日志进行压缩重命名并归档,并生成新的文件。对该日志进行压缩重命名并归档,并生成新的文件。对该日志进行压缩重命名并归档,并生成新的文件。

张紫娃的博客 8402

STM32F103C8T6+TB6612驱动直流电机全攻略(附PWM调速代码)

本文提供了一份基于STM32F103C8T6微控制器和TB6612驱动模块的直流电机驱动完整解决方案。详细解析了硬件连接、STM32CubeMX配置、HAL库驱动代码编写,并附带了PWM调速代码实现。内容涵盖从基础原理到实战调试的全过程,旨在帮助开发者快速构建稳定、可精准调速的电机控制系统,适用于智能车、机器人等嵌入式项目。

weixin_29181861的博客 586

Java日志体系学习3--Log4j2

Log4j2 试验一下,引入依赖 <!-- Log4j2 门面API--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.13.1</version> </dependency>

大魔王 6054

ROS Navigation global_planner框架解析

ROS Navigation global_planner框架解析主要讲一下我看源码总结的框架,如果大家跟着这个框架看源码的话可能会看的比较快。主要讲解global_planner关键配置参数含义及关键函数Astar,Dijkstra,QuadraticCalculator::calculatePotential,PotentialCalculator::calculatePotential,GridPath::getPath,GradientPath::getPath.

Jeff_Lee_的博客 4694

RML2016.10a (CNN、LSTM、CNN-LSTM、CNN-LSTM-Multi-head-attention, TensorFlow)

RML2016.10a (CNN、LSTM、CNN-LSTM、CNN-LSTM-Multi-head-attention, TensorFlow) 包含所有数据和代码,支持一键运行(jupyter)

qq_40999533的博客 1482

Log4j2 DefaultRolloverStrategy清理日志实战

基于Log4j2 DefaultRolloverStrategy快速灵活地配置应用日志自动清理策略

gaole93的博客 3423

BMP390L数字大气压传感器原理图设计,已量产(压力传感器)

在工业设备的室内定位、地下设施监测这类 GPS 信号盲区场景里,气压高度检测的 “靠谱程度” 直接决定了系统的可用性 —— 毕竟谁也不想在地下停车场导航时,设备把 1 楼误判成 3 楼。最近在项目里基于博世 BMP390L 做了硬件电路设计,正好聊聊这款工业级数字气压传感器的硬实力,以及原理图里的那些关键设计细节。

不脱发的程序猿 349

Log4j2常见使用示例及Syslog/Syslog-ng(详细)

准备工作 打开http://logging.apache.org/log4j/,点击左侧Download,我下载的是Apache Log4j 2 binary (zip),目前是2.0.2版本。解压后有30几个jar包,大部分是跟兼容性及移植性相关的可选组件,我们要用的是: log4j-api-2.0.2.jar log4j-core-2.0.2.jar    第一个示例程序

ichsonx的专栏 5030

北斗导航 | ILS(仪表着陆系统)、MLS(微波着陆系统)和GBAS(地基增强系统)的性能对比

最 早 的 GBAS 系 统 是 **局 域 增 强 系 统(LAAS)**,它是 1990 年由美国 Honeywell 公司 和 NASA 共 同 完 成 的 差 分 GPS(DGPS)演 变 而 来 的。1998 年,LAAS 被 ICAO 采 纳为 GBAS。2009 年 9 月 3 日 Honeywell 公 司 的GBAS 系统通过了 **CAT-I 精密进近着陆系统**的设计认证 ,而 **CAT-II 和 CAT-III 系统的研发和验证工作也正在有序的进行中**

尘世冰封的专栏 3984

多图详解VSCode搭建Python开发环境

本文通过多图的方式详细介绍了VSCode搭建Python开发环境,希望能对学习Python的同学们有所帮助。 文章目录 1. VSCode的介绍和安装 2. 安装插件 2.1 安装中文插件 2.2 安装Python插件 2.3 安装远程插件 3. 远程连接服务器 3.1 配置ssh 3.2 运行代码 3.3 调试代码

weixin_43178406的博客 8万+

log4j支持Syslog-ng的改造

log4j本身是支持syslog的,但是有很多不足,所以需要改造。 1.log4j在支持syslog时,默认同Msg大小是1024,这也是syslog的RFC3164标准。但是对于在实际应用中超过1024的MSG,我们还是希望能完整地log下来,所以log4j对大于1024的MSG进行拆包。这一拆就带来了麻烦。 因为priority,tag这些syslog标准的属性都是包含在MSG本身而当不是专门

诗剑书生的专栏 4109

基于学术研究风云卫星数据下载教程

目录 一、相关网址 1.登录注册网址:国家卫星气象中心 2.风云数据服务客户端下载网址 3.风云卫星遥感数据服务网址 二、下载数据步骤 1.首先在注册登录网址,注册一个账户 2.待账户审核后,登录账户即可搜索并下载数据 三、相关工具下载 1.登录风云卫星遥感数据服务网址 2.NCSA HDFView软件 3.风云卫星数据(L1)处理软件包(FENGYUN Toolkit v1.1) 4.静止卫星云图分区图显示软件(SECView) 5.风云二号静止气象卫星数据及产品处理..

珞瑜的博客 1万+

在 Java 服务端使用 syslog 作为日志系统

1. 为什么要用 syslog? 使用 syslog 的最大理由就是可以集中处理日志,通常一个中小型的服务端10来台机器,如果日志集中到一台服务器处理起来就非常方便。其次,你可以很方便地利用 syslog-ng 这一类的服务器来对日志进行分流,在只需要跟踪某一种类型的日志时就比较方便。除此之外,用文件做日志在部署时总会出现目录不存在,目录没有权限的情况,而用 syslog 就没有这个问题。 2...

weixin_30426879的博客 1228

Transformer实战(2)——循环神经网络详解

循环神经网络 (Recurrent neural networks, RNN) ,RNN 是在文本输入中广泛使用的神经网络。RNN 非常灵活,已被用于解决诸如语音识别、语言建模、机器翻译、情感分析和图像字幕等问题。RNN 利用输入的序列特性,序列输入可以是文本、语音、时间序列以及任何其他元素的出现取决于其前面元素的序列。在本节中,我们介绍了 RNN 及其变体,并学习如何使用 TensorFlow 进行实现。

盼小辉丶的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

linux 日志log4j,在Linux中使用log4j将日志数据写入syslog

我无法将日志消息写入syslog.任何帮助都会很棒.这是我简单的log4j程序import org.apache.log4j.Logger;import java.io.*;import java.sql.SQLException;import java.util.*;public class log4jExample{/* Get actual class name to be printed ...

weixin_33193177的博客 275

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

将log4j日志写入syslog

         由于工作需要,这几天研究了一下怎样将log4j的日志写入到syslog中。syslogd是UNIX系统的一个常见的组件,用于执行系统日志记录活动。syslogd从一组日志源(如:/dev/log和/dev/klog)中读取数据,并按/etc/syslog.conf中的说明处理这些日志消息。通过syslog()调用,将应用程序日志消息记录到syslog中。       log4

JAVA初学者笔记 5757

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Spring Boot集成syslog快速入门Demo

Syslog-ng是由Balabit IT Security Ltd.维护的一套开源的Unix和类Unix系统的日志服务套件。它是一个灵活的、可伸缩的系统日志记录程序。对于服务器日志集中收集,使用它是一个不错的解决方案。syslog-ng (syslog-Next generation) 是syslog的升级版。实现将springboot应用日志发送到syslog-ng。以上只是一些关键代码,所有代码请参见下面代码仓库。

HBLOG 1698

syslog 作为日志系统

1. 为什么要用 syslog? 使用 syslog 的最大理由就是可以集中处理日志,通常一个中小型的服务端10来台机器,如果日志集中到一台服务器处理起来就非常方便。 其次,你可以很方便地利用 syslog-ng 这一类的服务器来对日志进行分流,在只需要跟踪某一种类型的日志时就比较方便。 除此之外,用文件做日志在部署时总会出现目录不存在,目录没有权限的情况,而用 syslog 就

jazywoo_在路上 981
上一篇: Extjs中对日期的处理
下一篇: Java笔记--泛型总结与详解
honckly
博客等级 码龄20年 3粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值