log4cxx用环境变量设置输出文件名

(金庆的专栏 2016.12)

利用环境变量,可以用同一个log4j.xml来配置多个相似进程,输出日志到不同文件。

例如多个BaseApp进程使用同一个BaseApp.xml配置, SERVER_ID为环境变量:

  <appender name="ROLLING" class="org.apache.log4j.RollingFileAppender">  
      <param name="File" value="log/BaseApp_${SERVER_ID}.log" />
      ...  
  </appender>

代码启动时先读取server_id参数,然后设置 SERVER_ID 环境变量,然后再配置log4cxx.

int main(int argc, char* argv[])
{
    log4cxx::NDC ndcMain("");
    if (argc < 3)
    {
        LOG_ERROR(Fmt("Usage: %s cfg_file server_id") % argv[0]);
        return -1;
    }
    uint16_t uServerId = (uint16_t)atoi(argv[2]);
    if (!Util::SetServerIdEnv(uServerId))  // for log4cxx
        return -1;

    // Must after SetServerIdEnv().
    log4cxx::xml::DOMConfigurator::configureAndWatch("log4j/BaseApp.xml", 5000);
    LOG_INFO("--------------------------- ");
    LOG_INFO(Fmt("Start base app (ID=%1%).") % uServerId);
    LOG_INFO("--------------------------- ");
    ...
}  

SetServerIdEnv() 如下:

bool SetServerIdEnv(uint16_t uServerId)
{
    const char LOG_NAME[] = "SetServerIdEnv";
    static char buf[128] = {0};  // putenv need a buffer
    int nLen = snprintf(buf, sizeof(buf), "SERVER_ID=%u", uServerId);
    if (nLen < 0)
    {
        LOG_ERROR(Fmt("snprintf() failed. (%1%)%2%") % errno % strerror(errno));
        return false;
    }

    int nErr = putenv(buf);
    if (0 == nErr) return true;
    LOG_ERROR(Fmt("putenv() failed. (%1%)%2%") % errno % strerror(errno));
    return false;
}

运行目录下有个log4cxx缺省配置 log4j.xml, 会自动加载,
所以在 log4cxx 显式配置之前也可以调用日志输出。

运行多个BaseApp.exe:

start  Debug\Giant_BaseApp.exe  cfg.ini 4
start  Debug\Giant_BaseApp.exe  cfg.ini 3

log4cxx用环境变量设置输出文件名的更多相关文章

  1. Ubuntu下 jdk环境变量设置

    流程 1. 官网下载对应的jdk文件 2. 在根目录 / 下创建一个java目录 mkdir /java 3. 使用mv命令 将下载下来的文件(压缩格式),移动到上一步创建的/java目录下   Ps ...

  2. AIX系统的环境变量设置

    AIX系统的环境变量设置 用户环境的定义是通过设置环境变量来实现的.AIX系统主要使用两大类profile文件来定义用户环境.一类是用来为所有用户定制环境,另一类是为个人定义自己的环境. 登录时,sh ...

  3. tomcat配置及使用 环境变量设置

    Tomcat的配置及测试: 第一步:下载tomcat,然后解压到任意盘符 第二步:配置系统环境变量 我这里是tomcat5.5,解压到的D盘 (路径为: D:\Program Files\tomcat ...

  4. 【转】linux环境变量设置

    1. 显示环境变量HOME $ echo $HOME /home/terry 2. 设置一个新的环境变量WELCOME $ export WELCOME="Hello!" $ ec ...

  5. Ubuntu 下开发 Android 环境变量设置

    -----------------------------------------------------ANDROID_SDK_HOME:/home/cmm/avds PATH:/home/cmm/ ...

  6. 在Linux里环境变量设置的方法(export PATH)

    一般来说,配置交叉编译工具链的时候须要指定编译工具的路径,此时就须要环境变量设置.比如我的mips-linux-gcc编译器在"/opt/au1200_rm/build_tools/bin& ...

  7. mac laravel 环境变量设置bash_profile

    mac laravel 环境变量设置bash_profile >>>vim ~/.bash_profile '''text export PATH=$PATH:~/.composer ...

  8. 安装 go和beego后的环境变量设置

    简介 之前有几次因为环境变量设置的问题 损失了一些时间,特在此做记录 安装golang 可参考官方Getting Started,但有时候有问题. 解压 tar -C /usr/local -xzf ...

  9. SQL*Plus环境变量设置浅析

    SQL*Plus的使用环境是可以通过login.sql 或 glogin.sql脚本来设置的,可能很多初学者或不习惯使用SQL*Plus的老鸟都不知道.因为在如今UI工具(Toad.PL/SQL De ...

随机推荐

  1. 百度tn劫持解决办法

    最近用右键进行百度搜索的时候总是会跳转到 tn=99135173这类的小尾巴,使得搜索失败,十分恶心,这种广告劫持的手段十分高明隐蔽,很难发觉.开始以为是dns劫持或者是电脑中毒了,更换了几个dns, ...

  2. input和textarea标签的select()方法----选中文本框中的所有文本

    JavaScript select()方法选中文本框中的所有文本 <input>和<textarea>两种文本框都支持select()方法,这个方法用于选择文本框中的所有文本 ...

  3. 【django之Ajax】

    一.Ajax的简介 1.定义 AJAX(Asynchronous Javascript And XML)翻译成中文就是"异步Javascript和XML",是一种创建交互式网页应用 ...

  4. dropzone.js使用实践

    官网地址:http://www.dropzonejs.com/ 一,它是什么: DropzoneJS is an open source library that provides drag'n'dr ...

  5. TF-IDF In Scikit-Learn

    TF-IDF In Scikit-Learn 2017年9月30日补充   其实在算下面TF-IDF的步骤之前,还有一步,就是计算Term Frequency 也就是词频.当然,scikit-lear ...

  6. hdu 4568 Hunter 最短路+dp

    Hunter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  7. 【BZOJ3110】【ZJOI2013】k大数查询

    原题传送门 题意简析 给定一个区间,可以在这个区间上每个整数点插入若干个数(这些数数值可以重复)你需要支持2种操作: 1)在[a,b]间所有整数点插入c 2)查询[a,b]内第c大的数 解题思路 树套 ...

  8. 【HNOI2016】序列 莫队+单调栈+RMQ

    Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,…,ar-1,ar.若1≤l≤s≤t≤r≤n,则称a ...

  9. 4999: This Problem Is Too Simple!

    Description 给您一颗树,每个节点有个初始值. 现在支持以下两种操作: C i x(0<=x<2^31) 表示将i节点的值改为x. Q i j x(0<=x<2^31 ...

  10. [bzoj3673/3674可持久化并查集加强版]

    n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0<n,m<=2 ...