是否有任何开源工具可以将Apache Log4j 1.2.x的所有Layout 实现读入有意义的内容(例如,Log4j 自己的LogEvent对象)?到目前为止,我还没有找到可以做到这一点的应用程序(包括电锯)。
我正在寻找一些简单的东西,它从文本文件(纯文本文件或 XML)转换为 Java 对象,给定文件名和模式参数(例如,PatternLayout 中的格式模式)。如果它有一个清晰的 API 可以很容易地集成到应用程序中,那就更好了,但这不是必需的。
这是 Chainsaw 用于将模式布局转换为有用的东西的代码,仅使用 log4j API。对于 Chainsaw 的最新开发人员快照,它用于直接从 log4j xml 或属性文件 fileappender 条目构建 Chainsaw 配置。
使用 PatternParser#parse 填充的转换器和字段来做你想做的事。PatternParser 类包含在 log4j 'extras' 伴侣中。
public static String getLogFormatFromPatternLayout(String patternLayout) {
String input = OptionConverter.convertSpecialChars(patternLayout);
List converters = new ArrayList();
List fields = new ArrayList();
Map converterRegistry = null;
PatternParser.parse(input, converters, fields, converterRegistry, PatternParser.getPatternLayoutRules());
return getFormatFromConverters(converters);
}
如果您确实想要读取符合特定 PatternLayout 的日志文件并生成 log4j LoggingEvents 的东西,请参阅 LogFilePatternReceiver。Chainsaw 使用 getLogFormatFromPatternLayout 方法将 patternLayout 转换为接收方所需的 LogFormat。
顺便说一句,Chainsaw 的开发者快照包含许多额外的新功能——如果你想尝试一下,你可以在这里得到它:
我正在开发开源日志查看器OtrosLogViewer。您可以将它用作应用程序中的库。看看这个例子。
//Define log4j properties
Properties p = new Properties();
p.put("type", "log4j");
p.put("pattern", "TIMESTAMP LEVEL [THREAD] MESSAGE");
p.put("dateFormat", "yyyy-MM-dd HH:mm:ss,SSS");
Log4jPatternMultilineLogParser logParser = new Log4jPatternMultilineLogParser();
LogImporterUsingParser importerUsingParser = new LogImporterUsingParser(logParser);
importerUsingParser.init(p);
//
ParsingContext context = new ParsingContext();
//Create log collector, it capture all parsed log events
ProxyLogDataCollector dataCollector = new ProxyLogDataCollector();
//Create input stream from file
InputStream in = new FileInputStream("log4j/log4j.txt");
//parse log file
importerUsingParser.importLogs(in, dataCollector, context);
我遇到了您的项目,这是一项不错的工作,但理想情况下,我想要采用本机Log4j 转换模式(例如,%-5p [%t]: %m%n
)和使用该模式格式化的文件,并读取相应信息的东西。
本质上,我正在寻找Layout.format(LoggingEvent)
Log4j 的基本 Layout 类的方法的反向。此方法生成一个存储在日志文件中的字符串,因此反向操作将能够解析该文件并创建 LoggingEvent 对象或类似的东西(类似于反序列化过程)。
谢谢!
编辑:转换很简单,只需做
LogFilePatternLayoutBuilder.getLogFormatFromPatternLayout(conversionPattern);
通过 Chainsaw 类 org.apache.log4j.chainsaw.LogFilePatternLayoutBuilder。