(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 使用代码进行配置的更多相关文章

  1. AngularJS-系统代码的配置和翻译

    前言:在Web开发中常常会遇到这样的情况,有些页面的下拉选项是固定不变的几个,比如:性别,一般有男.女.保密等.对于这样的情形我们一般在数据库中存储的是数字或者其对应的代码,如果是可维护的需要系统给出 ...

  2. Entity Framework入门教程(18)---EF6中基于代码进行配置方式

    EF6中基于代码进行配置方式 我们以前对EF进行配置时是在app.config/web.config下的<entityframework>节点下进行配置的,EF6引进了基于代码的配置方法. ...

  3. 【译】第38节---EF6-基于代码的配置

    原文:http://www.entityframeworktutorial.net/entityframework6/code-based-configuration.aspx EF6引入了基于代码的 ...

  4. TestNG方法測试及注意要点 代码及配置具体解释(解决testng方法不运行问题)

    教你解决为什么TestNG中方法加了@Test注解,也在配置文件里配置了,可是方法就是不运行! 在使用TestNG进行測试时,使用配置文件的方式更easy于维护.可是常常遇到明明方法写了也配置运行了, ...

  5. Eclipse 代码风格配置

    代码风格配置:

  6. [译]17-spring基于java代码的配置元数据

    spring还支持基于java代码的配置元数据.不过这种方式不太常用,但是还有一些人使用.所以还是很有必要介绍一下. spring基于java代码的配置元数据,可以通过@Configuration注解 ...

  7. 使用java代码动态配置与xml文件结合的方式使用mybatis-generator生成代码配置

    1.使用java代码动态配置与xml文件结合的方式使用mybatis-generator生成代码配置 2.上代码:在resources目录下新建:generatorConfiguration.xml文 ...

  8. 代码方式配置springmvc的字符集过滤器

    之前一直用的xml方式配置 <filter> <filter-name>encoding</filter-name> <filter-class>org ...

  9. VS CODE一些常见配置操作(快捷键设置、C/C++的debug、代码路径配置)

    总述     今天来一篇简单的操作文章吧,VSCODE是我们经常用的软件,我之前也写过关于VSCODE远程办公的一些的操作(有兴趣的朋友可以点击进去看看),今天我再稍微介绍一些我其他地方用到的一些操作 ...

随机推荐

  1. javascript静态页面传值的三种方法分享

    一:JavaScript静态页面值传递之URL篇能过URL进行传值.把要传递的信息接在URL上.Post.htm 复制代码 代码如下: <input type="text" ...

  2. C#变量修饰符

    访问修饰符 关键字包括:internal,public,protected和private,用于设置变量的访问级别.  public  变量可以做为它所属的类型的一个字段,可以在任何地方访问它.  i ...

  3. 计算机网络课程优秀备考PPT之第四章介质访问控制层(四)

    为了记录自己从2016.9~2017.1的<计算机网络>助教生涯,也为了及时梳理和整写笔记! 前期博客是, 计算机网络课程优秀备考PPT之第一章概述(一) 计算机网络课程优秀备考PPT之第 ...

  4. SDCC 2016中国软件开发者大会十三大主题

    SDCC中国软件开发者嘉年华(Software Developer Carnival China),是由全球最大中文IT社区CSDN于2007年创办的软件技术领域顶级盛会,将如约于2016年11月18 ...

  5. ubuntu下pip install mysql-python 失败的解决方案

    ubuntu连接mysql 需要安装mysql-python 出现can not find mysql-config 文件错误 先安装 sudo apt-get install libmysqld-d ...

  6. JSP中的EL语言

    1,EL(Expression Language)是从JavaScript得到启发的一种表达式语言, 2,EL表达式包含文字,操作符,变量,函数调用: 3,EL 存取变量的语法格式:${ userna ...

  7. CodeForces 605A Sorting Railway Cars 思维

    早起一水…… 题意看着和蓝桥杯B组的大题第二道貌似一个意思…… 不过还是有亮瞎双眼的超短代码…… 总的意思呢…… 就是最长增长子序列且增长差距为1的的…… 然后n-最大长度…… 这都怎么想的…… 希望 ...

  8. UILabel 的属性设置

    .设置字体样式(加粗) label.font = [UIFont boldSystemFontOfSize:30]; 6.设置字体类型 label.font = [UIFont fontWithNam ...

  9. redis数据类型:hashes

    redis hash 是一个string类型的field和value的映射表. 它的添加.删除操作都是O(1)(平均),hash特别适合用于存储对象 将一个对象存储在hash类型总会占用更少的内存,并 ...

  10. CentOS中文件夹基本操作命令

    摘自:http://www.centoscn.com/CentOS/help/2013/1024/1967.html 文件(夹)查看类命令 ls--显示指定目录下内容 说明:ls 显示结果以不同的颜色 ...