如何自建appender扩展Log4j框架
1.log4j 概述
|
public class LogTestOne {
private final static Logger log = Logger.getLogger(LogTestOne.class);
public void doLog(){
log.debug("TestOne debug");
log.info("TestOne info");
log.warn("TestOne warn");
log.error("TestOne error");
log.fatal("TestOne fatal");
}
}
|
|
public class LogTestTwo {
private final static Logger log = Logger.getLogger(LogTestTwo.class);
public void doLog() {
log.debug("TestTwo debug");
log.info("TestTwo info");
log.warn("TestTwo warn");
log.error("TestTwo error");
log.fatal("TestTwo fatal");
}
}
|
|
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
<!-- =================== -->
<!-- Appenders -->
<!-- =================== -->
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler"/>
<param name="Target" value="System.out"/>
<param name="Threshold" value="DEBUG"/>
<layout class="org.apache.log4j.PatternLayout">
<!-- The default pattern: Date Priority [Category] Message\n -->
<param name="ConversionPattern" value="%-5p %l%m%n"/>
</layout>
</appender>
<appender name="FILE" class="org.apache.log4j.RollingFileAppender">
<errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler"/>
<param name="File" value="logui.log"/>
<param name="Threshold" value="INFO"/>
<param name="Append" value="false"/>
<param name="MaxFileSize" value="5000KB"/>
<param name="MaxBackupIndex" value="50"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%c{1}] %m%n"/>
</layout>
</appender>
<appender name="ONE" class="com.log.utils.LogOneAppender">
<errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler"/>
</appender>
<appender name="TWO" class="com.log.utils.LogTwoAppender">
<errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler"/>
</appender>
<!-- =============== -->
<!-- Loggers -->
<!-- =============== -->
<logger name="com.log.one">
<level value="DEBUG" />
<appender-ref ref="ONE"/>
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="com.log.two">
<level value="DEBUG" />
<appender-ref ref="TWO"/>
<appender-ref ref="CONSOLE"/>
</logger>
<root>
<priority value="INFO" />
<appender-ref ref="FILE"/>
</root>
</log4j:configuration>
|
|
public class LogOneAppender extends AppenderSkeleton{
public LogOneAppender() {}
protected void append(LoggingEvent event) {
LogUI.log(event);
}
public void close() {}
public boolean requiresLayout() {
return false;
}
}
|
|
public class LogTwoAppender extends AppenderSkeleton{
public LogTwoAppender() {}
protected void append(LoggingEvent event) {
LogUI.log(event);
}
public void close() {}
public boolean requiresLayout() {
return false;
}
}
|
|
public class LogUI {
private static LogUI instance;
private static JFrame frame;
private Log4JMonitor logMonitor;
private static List<Object> logCache = new ArrayList<Object>();
public LogUI() {
instance = this;
}
///////////////////////UI
private void buildUI() {
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.getContentPane().add(buildContentPanel(), BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.setSize(100, 75);
}
private Component buildContentPanel() {
JSplitPane contentSplit = new JSplitPane();
contentSplit.setTopComponent(new JTextArea("The Main Text"));
contentSplit.setBottomComponent(buildLogPanel());
contentSplit.setDividerLocation(550);
contentSplit.setResizeWeight(1);
return contentSplit;
}
private Component buildLogPanel() {
logMonitor = new Log4JMonitor();
logMonitor.addLogArea("log one", "com.log.one", true).setLevel(
Level.DEBUG);
logMonitor.addLogArea("log two", "com.log.two", true).setLevel(
Level.DEBUG);
for (Object message : logCache) {
logMonitor.logEvent(message);
}
return logMonitor;
}
public void show() {
buildUI();
frame.setVisible(true);
}
////////////////////Log
public static synchronized void log(final Object msg) {
if (instance == null || instance.logMonitor == null) {
logCache.add(msg);
return;
}
if (SwingUtilities.isEventDispatchThread()) {
instance.logMonitor.logEvent(msg);
} else {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
instance.logMonitor.logEvent(msg);
}
});
}
}
//////////////////Test Cases
public void doTests(){
LogTestOne one=new LogTestOne();
one.doLog();
LogTestTwo two=new LogTestTwo();
two.doLog();
}
public static void main(String[] args) throws Exception {
frame = new JFrame("LogUI ");
LogUI logUi = new LogUI();
logUi.show();
logUi.doTests();
}
}
|
|
public class Log4JMonitor extends JTabbedPane {
private JLogList defaultLogArea;
public Log4JMonitor() {
super(JTabbedPane.BOTTOM, JTabbedPane.SCROLL_TAB_LAYOUT);
}
public JLogList addLogArea(String title, String loggerName,
boolean isDefault) {
JLogList logArea = new JLogList(title);
logArea.addLogger(loggerName, !isDefault);
addTab(title, logArea);
if (isDefault)
defaultLogArea = logArea;
return logArea;
}
public void logEvent(Object msg) {
if (msg instanceof LoggingEvent) {
LoggingEvent event = (LoggingEvent) msg;
String loggerName = event.getLoggerName();
for (int c = 0; c < getTabCount(); c++) {
Component tabComponent = getComponentAt(c);
if (tabComponent instanceof JLogList) {
JLogList logArea = (JLogList) tabComponent;
if (logArea.monitors(loggerName)) {
logArea.addLine(msg);
}
}
}
} else if (defaultLogArea != null) {
defaultLogArea.addLine(msg);
}
}
public boolean hasLogArea(String loggerName) {
for (int c = 0; c < getTabCount(); c++) {
Component tabComponent = getComponentAt(c);
if (tabComponent instanceof JLogList) {
JLogList logArea = (JLogList) tabComponent;
if (logArea.monitors(loggerName)) {
return true;
}
}
}
return false;
}
}
|
如何自建appender扩展Log4j框架的更多相关文章
- 002 使用Appender扩展logger框架
这个地方,在看公司的源代码的时候,写的知识点: 现在再看,竟然不是太懂,重新写一份新的文档,外加示例说明. 一:说明 1.log4j 环境的三个主要组件: logger(日志记录器):控制要启用或禁用 ...
- log4j框架logger的继承关系以及使用场景
log4j框架logger的继承关系以及使用场景 log4j日志框架logger是存在继承关系的,我们一般都会在log4j.properties文件中定义log4j.rootLogger.其他所有lo ...
- Log4j框架
一.Log4j基本使用方法 Log4j由三个重要的组件构成:日志信息的优先级 Loggers,日志信息的输出目的地 Appenders,日志信息的输出格式 Layouts .日志信息的优先级从高到低 ...
- Log4J Appender - 将Log4J的日志内容发送到agent的source
项目中使用log4j打印的内容同时传输到flume 1.flume端 flume的agent配置内容如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 a1.sour ...
- 扩展Log4j支持JNDI数据源
log4j.properties配置文件: log4j.rootLogger=INFO,db #使用log4j扩展支持JNDI数据源 log4j.appender.db=com.qdgswx.log4 ...
- Kotlin的扩展函数:扩展Android框架(KAD 08)
作者:Antonio Leiva 时间:Jan 11, 2017 原文链接:https://antonioleiva.com/extension-functions-kotlin/ 扩展函数是Kotl ...
- 架构探险笔记3-搭建轻量级Java web框架
MVC(Model-View-Controller,模型-视图-控制器)是一种常见的设计模式,可以使用这个模式将应用程序进行解耦. 上一章我们使用Servlet来充当MVC模式中的Controller ...
- Robot Framework(十四) 扩展RobotFramework框架——创建测试库
4.1创建测试库 Robot Framework的实际测试功能由测试库提供.有许多现有的库,其中一些甚至与核心框架捆绑在一起,但仍然经常需要创建新的库.这个任务并不复杂,因为正如本章所示,Robot ...
- Robot Framework(十五) 扩展RobotFramework框架——远程库接口
4.2远程库接口 远程库接口提供了在运行Robot Framework本身的机器上运行测试库的方法,以及使用除本机支持的Python和Java之外的其他语言实现库的方法.对于测试库,用户远程库看起来与 ...
随机推荐
- @RequestParam--SpringMVC 注解系列文章(一)
概述 RequestParam 注解是使用 SpringMVC 开发过程中,比较常用的一个注解,用于映射请求参数. 代码 package rex.springmvc.handlers; import ...
- C++获取字符cin,getchar,get,getline的区别
原创作品,转载请注明来源:http://www.cnblogs.com/shrimp-can/p/5241544.html 1.cin>> 1)最常见的是获取输入的一个字符或数字,如 in ...
- oracle学习 笔记(1)
题记:之前用的是SQL server数据库,现因需求使用Oracle数据库,写此博客来记录学习: 一.表空间管理.用户管理.给用户授权 1.在Oracle中每创建数据库会在系统服务中多一个数据库实例, ...
- css的存在方式和选择器
css的存在方式 元素内联 页面嵌入 外部引入 元素内联 直接在html的标签中定义样式,类似于: <div style="属性1;属性2;属性3"><div&g ...
- MVC学习笔记3 - JsRender
许多发展平台减少代码和简化维护,使用模板和 HTML5 和 JavaScript 也不例外. JsRender 是一个 JavaScript 库使您可以一次定义一个样板文件结构,并使用它来动态地生成 ...
- Brackets--我的初恋编辑器
大学毕业以后,因为一些个人琐事没有找到自己专业的对口工作,整天混混沌沌得过着也没有打破现状的决心和机会.但是每当独自思考的时候总是一阵阵的害怕,怕自己从此一事无成一无所有.于是在某个心潮澎湃的瞬间开始 ...
- Windows下检测文件名大小写是否匹配
跨平台开发有一个众所周知,但因为只是偶尔受到困扰,一般人不会在意的问题,就是windows对文件名大小写不敏感,而其他平台对文件名大小写敏感.因此可能出现在windows平台开发时一切正常,但部署/打 ...
- 自动化测试培训:qtp脚本获取获取汇率数据
poptest(www.poptest.cn)致力于测试开发工程师的培训,以培养能胜任做测试工具开发,完成自动化测试,性能测试,安全性测试等工作能力为目标.自8月份成立2个月内中针对企业在职人员的能力 ...
- AngularJS1.X学习笔记3-内置模板指令
前面学习了数据绑定指令,现在开始学习内置模板指令.看起来有点多,目测比较好理解.OK!开始! 一.ng-repeat 1.基本用法 <!DOCTYPE html> <html lan ...
- Python Selenium设计模式-POM
前言 本文就python selenium自动化测试实践中所需要的POM设计模式进行分享,以便大家在实践中对POM的特点.应用场景和核心思想有一定的理解和掌握. 为什么要用POM 基于python s ...