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远程办公的一些的操作(有兴趣的朋友可以点击进去看看),今天我再稍微介绍一些我其他地方用到的一些操作 ...
随机推荐
- QTP脚本汇总比较有价值
1.Object Spy的Tips Hold the CTRL key to change the window focus or perform other mouse operations 2. ...
- Android KeyCode
KEYCODE_UNKNOWN=0; KEYCODE_SOFT_LEFT=1; KEYCODE_SOFT_RIGHT=2; KEYCODE_HOME=3; KEYCODE_BACK=4; KEYCOD ...
- css3技巧属性之text-overflow
text-overflow:clip | ellipsis 默认值:clip 取值: clip: 当对象内文本溢出时不显示省略标记(...),而是将溢出的部分裁切掉. ellipsis: 当对象内文本 ...
- 基于HTML5 的WebSql本地设备数据库
HTML5 的 Web SQL Database 用本地和会话存储实现简单的对象持久化,对繁琐的关系数据进行处理. 在 W3C 的 Web SQL Database 规范中(参照 介绍)有这样的描述: ...
- oracle索引
1,建立索引 create index goods_num on goods (num) tablespace data; 2,查看表上索引 select * from USER_INDEXES wh ...
- 详细解析Java中抽象类和接口的区别(转)
转自:http://dev.yesky.com/436/7581936.shtml 在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机 ...
- How to solve java.net.SocketTimeoutException:60000millis problem in HDFS
Many HDFS users encounter the following error when DFSClient ready file from a certain Data Node. & ...
- 《JS权威指南学习总结--第六章 对象》
内容要点: 一.对象定义 对象是JS的基本数据类型.对象是一种复合值:它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值. 对象也可看做是属性的无序集合,每个属性都是一个名/值对. 属性 ...
- 三、ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)
阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...
- Ambari安装组件出错
Caught an exception while executing custom service command: <class 'ambari_agent.AgentException.A ...