一、前言

  Log4j目前使用的有两个版本,分别是v1.x和2.x,相关的信息可以查看官方文档:http://logging.apache.org/log4j/2.x/index.html

二、引入依赖

  本文介绍log4j 2的用法,所以引入v2的jar包

<!--https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.12.1</version>
</dependency>

  

三、配置log4j

  可以参考官方文档:http://logging.apache.org/log4j/2.x/manual/configuration.html

  log4j v1使用properties文件进行配置;而log4j v2,常见的做法是使用xml进行配置。

  在resources目录下创建一个log4j2.xml,注意不是log4j.xml,先看下面的一个简单的配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="log_to_console" target="SYSTEM_OUT">
<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
</Console> <File name="log_to_file" fileName="/opt/logs/app.log">
<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
</File>
</Appenders> <Loggers>
<Root level="info">
<AppenderRef ref="log_to_console"/>
</Root>
</Loggers>
</Configuration>

  上面这个配置中,<Configuration>下有<Appenders>和<Loggers>两个标签。

  其中<Appenders>可以理解为日志的输出方式,可以是日志文件(File),也可以是可控制台输出(Console)。

3.1、<appenders>配置日志输出方式

  日志输出方式一般有两种,控制台输出(Console)和日志文件输出(File),在log4j 2中,分别对应<Console>和<File>标签。

<Appenders>
<Console name="log_to_console" target="SYSTEM_OUT">
<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
</Console> <File name="log_to_file" fileName="/opt/logs/app.log">
<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
</File>
</Appenders>

  上面定义了两个日志输出方式:

  Console的输出方式,名称为log_to_console(这个名称是为了后面需要引用它),输出到SYSTEM_OUT(也就是控制台了);

  File的输出方式,名称为log_to_file(名称可以随意指定),然后指定了日志文件的路径为/opt/logs/app.log。

  Console和File,其实可以统称为<Appender>(因为在<Appenders>标签下嘛)。

  这两个标签都有一个<PatternLayout>标签,这就是指定输出的日志格式,具体的格式可以查看官方文档。

  

  虽然日志有Console和File两种形式,但是还是<Appenders>中却可以配置多个Appender,比如虽然都为日志文件输出形式,但是文件名不同,就是不同的Appender,并不会冲突:

<Appenders>
<Console name="log_to_console" target="SYSTEM_OUT">
<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
</Console> <File name="log_to_file" fileName="/opt/logs/app.log">
<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
</File> <!-- 再定义一个日志文件输出的Appender -->
<File name="log_to_file_two" fileName="/opt/logs/app_2.log">
<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
</File>
</Appenders>

  

3.2、<Loggers>配置日志级别

  log4j 2有trace、debug、info、warn、error、fatal这几种日志级别,按照顺序严重程度递增。

  而<Loggers>可以理解配置不同的日志级别使用不同的日志输出方式,看下面的配置:

<Loggers>
<Root level="error">
<AppenderRef ref="log_to_file"/>
</Root> <logger level="info">
<AppenderRef ref="log_to_console"/>
</logger> <logger level="warn">
<AppenderRef ref="log_to_file_two"/>
</logger>
</Loggers>

  上面的配置中,配置了三个<logger>(<Root>也算一个<logger>),每一个<logger>下面有一个<AppenderRef>,指定以什么形式输出日志(File还是Console)。

  <Root>是一个比较特殊的<logger>,用来定义全局的日志界别,

  一个<logger>下面可以有一个或者多个<AppenderRef>:

  1、上面定义了全局的,只要是error级别或者比如error更高,都会将将日志写到/opt/logs/app.log中(log_to_file是前面<Appenders>中配置的);

  2、日志界别为info或者比info更高的级别,就会将日志输出到控制台(log_to_console是前面<Appenders>中配置的);

  3、日志界别为warn或者比warn更高的级别,就会将日志输出到/opt/logs/app_2.log(log_to_file_two是前面<Appenders>中配置的);

3.3、稍微拓展

  一个级别的日志,比如info日志,我们可能既需要输出到控制台,也需要输出到日志文件中。

  log4j 2可以这样做,前面已经说过了,一个<logger>下可以有多个<AppenderRef>,比如下面这段配置:

<Loggers>
<Root level="error">
<AppenderRef ref="log_to_file"/>
</Root> <!-- info或比info更高级别的日志,既输出到控制台,也输出到日志文件中-->
<logger level="info">
<AppenderRef ref="log_to_console"/>
<AppenderRef ref="log_to_file"/>
</logger>
</Loggers>

  

3.4、结合<Appenders>和<loggers>

  有了前面的了解,下面是一个例子,就可以理解了:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="log_to_console" target="SYSTEM_OUT">
<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
</Console> <Console name="log_to_console_two" target="SYSTEM_OUT">
<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
</Console> <File name="log_to_file" fileName="/opt/logs/app.log">
<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
</File> <File name="log_to_file_two" fileName="/opt/logs/app_2.log">
<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
</File>
</Appenders> <Loggers>
<Root level="error">
<AppenderRef ref="log_to_console"/>
<AppenderRef ref="log_to_file"/>
</Root> <logger level="info">
<AppenderRef ref="log_to_console"/>
<AppenderRef ref="log_to_file"/>
</logger> <logger level="warn">
<AppenderRef ref="log_to_console_two"/>
</logger>
</Loggers>
</Configuration>

  

  

  

  

Java 常见编码格式——URL、Base64的更多相关文章

  1. Java常见的乱码解决方式

    JAVA几种常见的编码格式(转)   简介 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换较多.本文将向你详细介绍 Java 中编码 ...

  2. JAVA常见中文问题的解决方法(转)

    JAVA常见中文问题的解决方法 http://www.java-cn.com/club/article-5876-1.html 以下解决方案是笔者在日常生活中遇到的,希望能对你解决JAVA中文问题有所 ...

  3. Java常见加密技术的密钥与加密串长度

    Java常见的Java方式 1.Base64编码 2.十六进制(Hex)编码 3.MD消息摘要 4.DES加密 5.3DES加密 6.AES加密 6.RSA加密

  4. Java 8中的Base64编码和解码

    转自:https://juejin.im/post/5c99b2976fb9a070e76376cc Java 8会因为将lambdas,流,新的日期/时间模型和Nashorn JavaScript引 ...

  5. java常见的 http 请求库比较

    java常见的http请求库有httpclient,RestTemplate,OKhttp,更高层次封装的 feign.retrofit 1.HttpClient HttpClient:代码复杂,还得 ...

  6. 如何用java实现图片与base64转换

    如果你是一个软件开发,不论前端后端工程师,图片的处理你是肯定要会的,关于图片的Base64编码,你可能有点陌生,但是这是一个软件工程师应该要掌握的知识点,现在很多网友把图片与base64转换都做成了小 ...

  7. java后台调用url无协议

    url格式不正确,可能有"www.baidu.com"    "这个不能有 // 下载pdf public void downpdf(String URL, String ...

  8. Java常见的几种内存溢出及解决方法

    Java常见的几种内存溢出及解决方法[情况一]:java.lang.OutOfMemoryError:Javaheapspace:这种是java堆内存不够,一个原因是真不够(如递归的层数太多等),另一 ...

  9. Java文件编码格式转换

    转自博文<Java文件编码格式转换>: 默认被转换的格式为GBK,转换成的格式为UTF-8 import info.monitorenter.cpdetector.CharsetPrint ...

随机推荐

  1. 【Ubuntu16.04.4】常用配置

    1.为root用户设置密码 sudo passwd root 2.设置用户登陆界面 sudo gedit  /usr/share/lightdm/lightdm.conf.d/50-unity-gre ...

  2. [Hive_add_10] Hive 的 serde (序列化 & 反序列化) 操作

    0. 说明 serde 是序列化和反序列化 serialize & deserialize 是将文件中的字段映射成 Hive 中的列 1. 验证 1.1 openCSVSerde CSV 为逗 ...

  3. 登录Windows界面前执行自定义脚本

    通常情况下,进入Windows界面之前都有一个登录过程,如何在登录前让系统执行脚本呢?下面介绍一种方法. 1.打开组策略,在Run(运行)中输入GREDIT.MSC,点击确认. 2.依次点击Compu ...

  4. docker 私有仓库简易搭建

    概要 本地私有仓库 局域网私有仓库 总结 概要 docker hub 使用非常方便,而且上面有大量的镜像可以使用. 但是,每次都远程下载镜像速度非常慢,如果能在本地做一个 docker 的仓库,多人协 ...

  5. May 26. 2018 Week 21st Saturday

    Do what you say, say what you do. 做你说过的,说你能做的. Be honest to yourself, and be honest to those people ...

  6. java 对象属性复制,将一个对象的属性值赋值给另一个对象, 属性名需要相同

    import org.springframework.beans.BeanUtils; BeanUtils.copyProperties(源对象, 目标对象);

  7. 现在使用Nginx实现TCP反向代理

    Nginx 在1.9.0版本发布以前如果要想做到基于TCP的代理及负载均衡需要通过打名为 nginx_tcp_proxy_module 的第三方patch来实现,该模块的代码托管在github上网址: ...

  8. .Net下的全局异常捕获问题

    全局异常捕获主要目标并不是为了将异常处理掉防止程序崩溃.因为当错误被你的全局异常捕获器抓到的时候,已经证实了你程序中存在BUG. 一般而言,我们的全局异常捕获主要作用就是接收到异常之后进行异常的反馈. ...

  9. linux学习(杂项)

    内存使用情况 磁盘使用情况 负载情况 查看cpu 可视化磁盘 循环创建文件夹 删除文件夹 移动文件 gg行首 G行尾 dd删除一行 u恢复 yy复制一行 p粘贴一行 enter下翻 less 与 mo ...

  10. Python学习笔记(1)-列表

    列表是什么? 列表由一系列按特定顺序排列的元素组成.列表看起来像这样:[1,2,3,4,1].在列表中,可以由零个或多个元素组成,元素之间用逗号分开,具有相同值元素允许出现多次 使用[ ]或list( ...