Java 常见编码格式——URL、Base64
一、前言
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的更多相关文章
- Java常见的乱码解决方式
JAVA几种常见的编码格式(转) 简介 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换较多.本文将向你详细介绍 Java 中编码 ...
- JAVA常见中文问题的解决方法(转)
JAVA常见中文问题的解决方法 http://www.java-cn.com/club/article-5876-1.html 以下解决方案是笔者在日常生活中遇到的,希望能对你解决JAVA中文问题有所 ...
- Java常见加密技术的密钥与加密串长度
Java常见的Java方式 1.Base64编码 2.十六进制(Hex)编码 3.MD消息摘要 4.DES加密 5.3DES加密 6.AES加密 6.RSA加密
- Java 8中的Base64编码和解码
转自:https://juejin.im/post/5c99b2976fb9a070e76376cc Java 8会因为将lambdas,流,新的日期/时间模型和Nashorn JavaScript引 ...
- java常见的 http 请求库比较
java常见的http请求库有httpclient,RestTemplate,OKhttp,更高层次封装的 feign.retrofit 1.HttpClient HttpClient:代码复杂,还得 ...
- 如何用java实现图片与base64转换
如果你是一个软件开发,不论前端后端工程师,图片的处理你是肯定要会的,关于图片的Base64编码,你可能有点陌生,但是这是一个软件工程师应该要掌握的知识点,现在很多网友把图片与base64转换都做成了小 ...
- java后台调用url无协议
url格式不正确,可能有"www.baidu.com" "这个不能有 // 下载pdf public void downpdf(String URL, String ...
- Java常见的几种内存溢出及解决方法
Java常见的几种内存溢出及解决方法[情况一]:java.lang.OutOfMemoryError:Javaheapspace:这种是java堆内存不够,一个原因是真不够(如递归的层数太多等),另一 ...
- Java文件编码格式转换
转自博文<Java文件编码格式转换>: 默认被转换的格式为GBK,转换成的格式为UTF-8 import info.monitorenter.cpdetector.CharsetPrint ...
随机推荐
- php的register_long_arrays可以关闭以提高性能
如果你使用php5.0以上,在程序中没有使用$HTTP_*_VARS这种变量,那么就可以考虑将register_long_arrays设置为Off,来提高一点点性能.看下PHP手册中关于registe ...
- Linux 基本操作 (day2)
一.用户的基本操作 1.添加和删除用户(管理员): useradd 用户名: useradd taibai passwd 用户名: passwd taibai [root@localhost ~] ...
- flex布局大讲解
http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html?utm_source=tuicool
- JavaScript的内置对象(Math对象)
Math对象概述 Math(算数)对象的作用是:执行常见的算数任务.保存数学公式和信息. 与我们在JavaScript 直接编写计算功能相比,Math 对象提供的计算功能执行起来要快得多. Math ...
- bootstrap-table 分页
bootstrap-table <!DOCTYPE html> <head> <meta charset="UTF-8"/> <tit ...
- python入门学习:4.if语句
python入门学习:4.if语句 关键点:判断 4.1 一个简单的测试4.2 条件测试4.3 if语句 4.1 一个简单的测试 if语句基本格式如下,注意不要漏了冒号 1if 条件 :2 ...
- CF817F MEX Queries
嘟嘟嘟 这题一直在我的某谷任务计划里,不知为啥一直没做. 现在看起来很水啊,就是离散化+线段树.可能是当时没想明白怎么离散化吧. 就是先把算有区间端点都离线下来,然后把\(l - 1, l, l + ...
- docker-1-环境安装及例子实践
1.安装go 先新建一个Go的工作空间文件夹,文件夹路径建议放在$HOME下: userdeMacBook-Pro:~ user$ cd $HOME userdeMacBook-Pro:~ user$ ...
- .NET Core中延迟单例另一种写法【.NET Core和.NET Framework的beforefieldinit差异】
1.BeforeFieldInit是什么 前段时间在反编译代码时无意间看到在类中有一个BeforeFieldInit特性,处于好奇的心态查了查这个特性,发现这是一个关于字段初始化时间的特性[提前初始化 ...
- Spark访问与HBase关联的Hive表
知识点1:创建关联Hbase的Hive表 知识点2:Spark访问Hive 知识点3:Spark访问与Hbase关联的Hive表 知识点1:创建关联Hbase的Hive表 两种方式创建,内部表和外部表 ...