项目里面常常用到日志,Java开发通常用log4j、slf4j这些框架,看着配置文件有点懵。这几天看公司代码的时候,也有用到log4j,感受要复杂一点。在本地打log,也有打到hive里面存的。看了一下公司日志的组件架构,有两种方式。spring
一种打到服务器本地,经过agent收集到hive,kafka等组件,供日志中心、服务管理中心、storm等组件消费。apache
一种经过rpc服务打到本地agent,在经过agent上报到远程服务器,看了源码,是扩展了log4j框架。log4j支持这种扩展,继承一些框架的类。spring也支持这种扩展,不少公司也在使用这种扩展。好比,spring2.0开始支持schema的扩展,在dubbo中也用到了,封装了本身的xml标识。api
这里贴一个我写的log4j demo服务器
maven依赖架构
<dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.8.0-beta2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.11.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.11.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.11.1</version> </dependency> </dependencies>
测试类app
public class HelloSlf4j { public static void main(String[] args) { for(int i = 0; i < 10; i++){ Logger logger = LoggerFactory.getLogger(HelloSlf4j.class); logger.debug("Hello Slf4j"); } } }
配置框架
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="INFO"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> </Console> <File name="MyFile" fileName="all.log" immediateFlush="false" append="false"> <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </File> <File name="MyFile1" fileName="all1.log" immediateFlush="false" append="true"> <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </File> <File name="async" fileName="async.log" immediateFlush="false" append="true"> <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </File> <Async name="scribeAsyncAppender" errorRef="async" bufferSize="102400" blocking="false"> <AppenderRef ref="async"/> </Async> </Appenders> <Loggers> <Root level="debug"> <!--<AppenderRef ref="Console" />--> <AppenderRef ref="MyFile"/> <AppenderRef ref="scribeAsyncAppender"/> </Root> <Logger name="com.gxf.slf4j.HelloSlf4j" level="debug"> <AppenderRef ref="Console"/> <AppenderRef ref="MyFile1"/> </Logger> </Loggers> </Configuration>
这里主要须要理清楚几个组件之间的关系,Root、Logger、Appenderasync
Root相似于一个父类的Logger,全部的logger都继承他的属性,logger自定义的属性会覆盖掉父类log配置maven
Logger对外提供使用接口,如log.info()等方法。能够有多个Appender测试
Appender是往控制台、文件中写内容的组件