IDEA+scala程序中调用日志-log4j
slf4j提供的是一个抽象的接口,实现可以是log4j、logback等,但是,运行时候只能有一个接口实现类。
org.apache.hadoop:hadoop-common包自带log4j,maven中配置了安装hadoop-common也相当于自动安装了log4j。
org.apache.spark:spark-core_2.11自带log4j。
log4j文档:http://logging.apache.org/log4j/2.x/manual/configuration.html#Properties
学习参考网址:https://baike.baidu.com/item/log4j/480673?fr=aladdin
https://blog.csdn.net/u013870094/article/details/79518028
一、log4j的基本使用方法
(1)在maven配置文件中添加log4j相关的依赖
<!-- 加入log4j支持 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> |
(2)在项目中添加log4j的配置文件
Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件(键=值)log4j.properties。
配置文件要放在src.main下新建的一个资源文件夹resources里面,并把resources文件夹Mark as Resources格式。
把resources文件夹Mark as Resources格式方法:
IDEA-->FIle-->Project Seetings-->Modules-->右侧选中src.main.resource文件夹,再点击右侧中间Mark as中的Resources-->Apply-->OK |
src.main.resources文件夹里的log4j.properties
### 设置Logger |
(3)在程序中调用
例如App.scala
import org.apache.log4j.Logger object App { |
二、log4j配置文件详细介绍
Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显 示内容。
下面介绍使用Java特性文件log4j.properties做为配置文件的方法:
1.配置Logger
Logger 负责处理日志记录的大部分操作。
根Logger语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, … |
appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。 appenderName一定要是大写,而且逗号之间不能有空格。 |
其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log 4 j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。 < br > 通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。 < br > 比如在这里定义了INFO级别,只有等于及高于这个级别的才进行处理,则应用程序中所有DEBUG级别的日志信息将不被打印出来。 < br > ALL : 打印所有的日志,OFF:关闭所有的日志输出。 |
定义非根记录器的语法:
log4j.logger.loggerName1 = [ level ], appendName1,…appendNameN …… log4j.logger.loggerNameM = [ level ], appendName1, …appendNameN |
可以定义任意个非根记录器,非根记录器对根记录器有继承和覆盖的关系。
非根记录器的level可继承根记录器,也可比根记录器高级或低级,且不影响根记录器的日志记录。
2.配置日志信息输出目的地Appender
Appender 负责控制日志记录操作的输出。
其语法为:
og4j.appender.appenderName = fully.qualified.name.of.appender.class log4j.appender.appenderName.option1 = value1 … log4j.appender.appenderName.optionN = valueN |
appenderName可任意起名。
其中,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台), org.apache.log4j.FileAppender(文件), org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件), org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件), |
3.配置日志信息的格式(布局)Layout
Layout 负责格式化Appender的输出。
其语法为:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class log4j.appender.appenderName.layout.option1 = value1 … log4j.appender.appenderName.layout.optionN = valueN |
其中,Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局), org.apache.log4j.PatternLayout(可以灵活地指定布局模式), org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息) |
Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:
%m 输出代码中指定的消息; %M 输出打印该条日志的方法名; %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL; %r 输出自应用启动到输出该log信息耗费的毫秒数; %c 输出所属的类目,通常就是所在类的全名; %t 输出产生该日志事件的线程名; %n 输出一个回车换行符,Windows平台为"rn”,Unix平台为"n”; %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如: %d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2002-10-18 22:10:28,921; %l 输出日志事件的发生位置,及在代码中的行数。举例:Testlog4.main(TestLog4.java:10) |
三、Scala程序中调用
1.获得日志记录器
使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。
获取根记录器语法为:
import org.apache.log4j.Logger private val logRoot:Logger = Logger.getRootLogger |
根据记录器名字获取记录器语法为:
private val log:Logger = Logger.getLogger(StringName) |
非根记录器调用相互不影响,但是调用非根记录,根记录的语句一样会执行。
2.插入记录信息(格式化日志信息)
使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:
Logger.debug ( Object message ) ; Logger.info ( Object message ) ; Logger.warn ( Object message ) ; Logger.error ( Object message ) ; |
日志级别
每个Logger都被了一个日志级别(log level),用来控制日志信息的输出。日志级别从高到低分为:
off 最高等级,用于关闭所有日志记录。 fatal 指出每个严重的错误事件将会导致应用程序的退出。 error 指出虽然发生错误事件,但仍然不影响系统的继续运行。 warm 表明会出现潜在的错误情形。 info 一般和在粗粒度级别上,强调应用程序的运行全程。 debug 一般用于细粒度级别上,对调试应用程序非常有帮助。 all 最低等级,用于打开所有日志记录。 |
上面这些级别是定义在org.apache.log4j.Level类中。Log4j只建议使用4个级别,优先级从高到低分别是error,warn,info和debug。通过使用日志级别,可以控制应用程序中相应级别日志信息的输出。例如,如果使用b了info级别,则应用程序中所有低于info级别的日志信息(如debug)将不会被打印出来。
举个log4j.xml例子,log4j.xml和log4j.properties同时存在的时候,xml文件会替换到properties文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd"> <log4j:configuration> <!-- 日志输出到控制台 --> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <!-- 日志输出格式 --> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss SSS}][%c]-[%m]%n"/> </layout> <!--过滤器设置输出的级别--> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <!-- 设置日志输出的最小级别 --> <param name="levelMin" value="INFO"/> <!-- 设置日志输出的最大级别 --> <param name="levelMax" value="ERROR"/> </filter> </appender> <!-- 输出日志到文件 --> <appender name="fileAppender" class="org.apache.log4j.FileAppender"> <!-- 输出文件全路径名--> <param name="File" value="/home/xl/CodeStore/log_log4j/logxml.log"/> <!--是否在已存在的文件追加写:默认时true,若为false则每次启动都会删除并重新新建文件--> <param name="Append" value="false"/> <param name="Threshold" value="INFO"/> <!--是否启用缓存,默认false--> <param name="BufferedIO" value="false"/> <!--缓存大小,依赖上一个参数(bufferedIO), 默认缓存大小8K --> <param name="BufferSize" value="512"/> <!-- 日志输出格式 --> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%p][%d{yyyy-MM-dd HH:mm:ss SSS}][%c]-[%m]%n"/> </layout> </appender> <!-- 日志输出到文件,可以配置多久产生一个新的日志信息文件 --> <appender name="dailyRollingAppender" class="org.apache.log4j.DailyRollingFileAppender"> <!-- 文件文件全路径名 --> <param name="File" value="/home/xl/CodeStore/log_log4j/logxml1.log"/> <param name="Append" value="true" /> <!-- 设置日志备份频率,默认:为每天一个日志文件 --> <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" /> <!--每分钟一个备份--> <!--<param name="DatePattern" value="'.'yyyy-MM-dd-HH-mm'.log'" />--> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%p][%d{HH:mm:ss SSS}][%c]-[%m]%n"/> </layout> </appender> <!-- 1. 指定logger的设置,additivity是否遵循缺省的继承机制 2. 当additivity="false"时,root中的配置就失灵了,不遵循缺省的继承机制 3. 代码中使用Logger.getLogger("logTest")获得此输出器,且不会使用根输出器 --> <logger name="logTest" additivity="false"> <level value ="INFO"/> <appender-ref ref="dailyRollingAppender"/> </logger> <!-- 根logger的设置,若代码中未找到指定的logger,则会根据继承机制,使用根logger--> <root> <appender-ref ref="console"/> <appender-ref ref="fileAppender"/> <appender-ref ref="dailyRollingAppender"/> </root> </log4j:configuration> |