log4cxx 使用代码进行配置
(1)官网的一个例子
#include <log4cxx/logger.h>
#include <log4cxx/helpers/pool.h>
#include <log4cxx/basicconfigurator.h>
#include <log4cxx/fileappender.h>
#include <log4cxx/simplelayout.h> int main() {
log4cxx::FileAppender * fileAppender = new
log4cxx::FileAppender(log4cxx::LayoutPtr(new log4cxx::SimpleLayout()),
"logfile", false); log4cxx::helpers::Pool p;
fileAppender->activateOptions(p); log4cxx::BasicConfigurator::configure(log4cxx::AppenderPtr(fileAppender));
log4cxx::Logger::getRootLogger()->setLevel(log4cxx::Level::getDebug());
log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger("logger"); LOG4CXX_INFO(logger,"Created FileAppender appender"); return 0;
}
(2)一个只使用代码的例子dailyrollingfileappender(经过验证)
ostringstream oss;
oss << getpid();
string pid= oss.str();
MDC::put("pid", oss.str()); //使得layout中可以携带进程号信息 PatternLayoutPtr layout = new PatternLayout();
string conversionPattern = "[%p] %d %c %M - %m%n";
layout->setConversionPattern(conversionPattern);
// creates daily rolling file appender
DailyRollingFileAppenderPtr rollingAppenderptr = new DailyRollingFileAppender();
rollingAppenderptr->setFile("/opt/bre/LrSortService/log/LrSortService.log."+pid);
rollingAppenderptr->setDatePattern("'.'yyyy-MM-dd");
rollingAppenderptr->setLayout(layout);
log4cxx::helpers::Pool p;
rollingAppenderptr->activateOptions(p); // configures the root logger
log4cxx::LoggerPtr logger = log4cxx::Logger::getRootLogger();
logger->setLevel(log4cxx::Level::getDebug());
logger->addAppender(rollingAppenderptr); LOG4CXX_INFO(logger,"Created FileAppender appender");
(3)一个例子。使用RollingFileAppender和TimeBasedRollingPolicy(未经验证)
private static void log4jConfig(String actionName) {
org.apache.log4j.Logger rootLogger = LogManager.getRootLogger();
RollingFileAppender fileAppender = (RollingFileAppender)rootLogger.getAppender("fileAppender");
// <param name="FileNamePattern" value="/var/log/Launcher.log.%d{yyyy-MM-dd}.gz"/>
String currentLogFile = fileAppender.getFile();
String newLogPattern = currentLogFile.replace(LOG4J_ROLLING_FILE_NAME_TOKEN, actionName);
fileAppender.setFile(newLogPattern);
TimeBasedRollingPolicy timeBasedRollingPolicy = (TimeBasedRollingPolicy) fileAppender.getRollingPolicy();
String fileNamePattern = timeBasedRollingPolicy.getFileNamePattern();
String newFileNamePattern = fileNamePattern.replace(LOG4J_ROLLING_FILE_NAME_TOKEN, actionName);;
timeBasedRollingPolicy.setFileNamePattern(newFileNamePattern);
timeBasedRollingPolicy.activateOptions();
fileAppender.activateOptions();
LOG.info(" Redirected launcher log output to log pattern: " + newFileNamePattern);
}
(4)一个使用xml配置文件和代码协同工作的例子。(有问题)
参考:http://stackoverflow.com/questions/29769018/log4cxx-timebasedrollingpolicy-wont-keep-old-log-when-used-programtically
i'm trying use log4cxx combined with xml file and code in multiprocess, hope each process create a log and can rollback in TimeBasedRollingPolicy. here is my xml file:
<?xml version="1.0" encoding="UTF-8" ?>
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="bfd_recommend_appender" class="org.apache.log4j.rolling.RollingFileAppender">
<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="FileNamePattern" value="/opt/bre/LrSortService/log/LrSortService.log.%d{yyyyMMdd}" />
</rollingPolicy>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%-5p %d (%F:%L:%c) @ %X{pid}] - %m%n" />
</layout>
</appender>
<!-- Specify the level for some specific categories -->
<root>
<level value="debug" />
<appender-ref ref="bfd_recommend_appender"/>
</root>
</log4j:configuration>
then my code:
void LrSortService::InitLog(const std::string& logconf) {
ostringstream oss;
oss << getpid();
MDC::put("pid", oss.str());
DOMConfigurator::configure(logconf);
LoggerPtr logger(log4cxx::Logger::getRootLogger());
FileAppenderPtr oldappenderptr;
oldappenderptr = logger->getAppender("bfd_recommend_appender");
string oldfile = oldappenderptr->getFile();
string pid = oss.str();
string newfile1 = oldfile + ".";
string newfile = newfile1 + pid;
oldappenderptr->setFile(newfile);
log4cxx::helpers::Pool p;
oldappenderptr->activateOptions(p);
cout<<"set log OK , log filename is: "<<newfile<<endl;
}
what i got:
-rw-rw-r-- 1 bre bre 1809500 Apr 20 23:59 LrSortService.log.20150420
-rw-rw-r-- 1 bre bre 26807477 Apr 21 17:37 LrSortService.log.20150420.2297
-rw-rw-r-- 1 bre bre 23429289 Apr 21 17:37 LrSortService.log.20150420.2374
-rw-rw-r-- 1 bre bre 23546280 Apr 21 17:37 LrSortService.log.20150420.2451
-rw-rw-r-- 1 bre bre 22566813 Apr 21 17:37 LrSortService.log.20150420.2528
and yesterday i got:
LrSortService.log.20150420.2297
LrSortService.log.20150420.2374
LrSortService.log.20150420.2451
LrSortService.log.20150420.2528
what i meant to get is (today is 20150421):
LrSortService.log.20150420.2297
LrSortService.log.20150420.2374
LrSortService.log.20150420.2451
LrSortService.log.20150420.2528
LrSortService.log.20150421.2297
LrSortService.log.20150421.2374
LrSortService.log.20150421.2451
LrSortService.log.20150421.2528
any help will be appreciated ,thanks !
log4cxx 使用代码进行配置的更多相关文章
- AngularJS-系统代码的配置和翻译
前言:在Web开发中常常会遇到这样的情况,有些页面的下拉选项是固定不变的几个,比如:性别,一般有男.女.保密等.对于这样的情形我们一般在数据库中存储的是数字或者其对应的代码,如果是可维护的需要系统给出 ...
- Entity Framework入门教程(18)---EF6中基于代码进行配置方式
EF6中基于代码进行配置方式 我们以前对EF进行配置时是在app.config/web.config下的<entityframework>节点下进行配置的,EF6引进了基于代码的配置方法. ...
- 【译】第38节---EF6-基于代码的配置
原文:http://www.entityframeworktutorial.net/entityframework6/code-based-configuration.aspx EF6引入了基于代码的 ...
- TestNG方法測试及注意要点 代码及配置具体解释(解决testng方法不运行问题)
教你解决为什么TestNG中方法加了@Test注解,也在配置文件里配置了,可是方法就是不运行! 在使用TestNG进行測试时,使用配置文件的方式更easy于维护.可是常常遇到明明方法写了也配置运行了, ...
- Eclipse 代码风格配置
代码风格配置:
- [译]17-spring基于java代码的配置元数据
spring还支持基于java代码的配置元数据.不过这种方式不太常用,但是还有一些人使用.所以还是很有必要介绍一下. spring基于java代码的配置元数据,可以通过@Configuration注解 ...
- 使用java代码动态配置与xml文件结合的方式使用mybatis-generator生成代码配置
1.使用java代码动态配置与xml文件结合的方式使用mybatis-generator生成代码配置 2.上代码:在resources目录下新建:generatorConfiguration.xml文 ...
- 代码方式配置springmvc的字符集过滤器
之前一直用的xml方式配置 <filter> <filter-name>encoding</filter-name> <filter-class>org ...
- VS CODE一些常见配置操作(快捷键设置、C/C++的debug、代码路径配置)
总述 今天来一篇简单的操作文章吧,VSCODE是我们经常用的软件,我之前也写过关于VSCODE远程办公的一些的操作(有兴趣的朋友可以点击进去看看),今天我再稍微介绍一些我其他地方用到的一些操作 ...
随机推荐
- 移动端rem适配问题
将下面这段代码,放在头部的script标签里,可解决字体适配问题 比例是28px = 1rem function __setFontSize__(){document.documentElement. ...
- python生产者消费者模型
业界用的比较广泛,多线程之间进行同步数据的方法,解决线程之间堵塞,互相不影响. server --> 生产者 client --> 消费者 在一个程序中实现又有生产者又有消费者 ,生产者不 ...
- lldb 命令
po [[UIWindow keyWindow] recursiveDescription]
- UIView 和 CALayer 的区别和联系
UIView是在/System/Library/Frameworks/UIKit.framework定义,也就是处于Cocoa Touch层. CALyer是在/System/Library/Fram ...
- 辽宁OI2016夏令营模拟T3-chess
放棋子(chess.pas/c/cpp)题目大意现在有一个 n*m 的棋盘,现在你需要在棋盘上摆放 2n 个棋子,要求满足如下条件:1. 每一列只能有一个棋子:2. 每一行的前 xi 个格子有一个棋子 ...
- Matches Puzzle Game
Matches Puzzle Game 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5456 数位DP 首先我把C-A=B改为A+B=C(我觉得会简单 ...
- JS复习:第二十三章
一.Cookie的构成: 1.名称:一个唯一确定cookie的名称.cookie名称不区分大小写,必须是经过URL编码的. 2.值:存储在cookie中的字符串值,必须被URL编码. 3.域:cook ...
- js禁止浏览器后退,防止重复支付
<script language="JavaScript"> javascript:window.history.forward(1);</script>
- Infix to postfix without '(' and ')'
#include<iostream> #include<stack> #include<string> #include<deque> using na ...
- NOIP2011-普及组复赛-第一题-数字反转
题目描述 Description 给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2). 输入 ...