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. IIS进行URL重写

    一.Why? 1.先来讲一讲为什么我们要使用url重写这个东西 2.因为我学习的后端是nodejs,然后我发现nodejs一个非常让人难受的事,就是它监听端口不是80和443时,你访问网页需要输入端口 ...

  2. ls-dyna基础教程

    刚刚开始使用ls-dyna,几天前还只知道点开dyna界面,然后就没有然后了,没人带,资料也没多少,但是科研还得继续往下做呀(手动滑稽),通过在仿真论坛上搜索相关的资料,并通过自己的一步步操作,做了大 ...

  3. A Neural Algorithm of Artistic Style 图像风格转换 - keras简化版实现

    前言 深度学习是最近比较热的词语.说到深度学习的应用,第一个想到的就是Prisma App的图像风格转换.既然感兴趣就直接开始干,读了论文,一知半解:看了别人的源码,才算大概了解的具体的实现,也惊叹别 ...

  4. Ajax/XHR/HTTP/jQuery Ajax

    Ajax即通过XHR API使用js发起的异步网络请求,它不会导致页面刷新,因此是现代Web App的关键技术. HTTP协议是Web开发中最重要的网络协议,HTTP协议详细规定了请求和响应报文. 请 ...

  5. 视觉slam学习之路(一)看高翔十四讲所遇到的问题

      目前实验室做机器人,主要分三个方向,定位导航,建图,图像识别,之前做的也是做了下Qt上位机,后面又弄红外识别,因为这学期上课也没怎么花时间在项目,然后导师让我们确定一个方向来,便于以后发论文什么. ...

  6. Discuz利用UC_KEY进行前台getshell

    来源:http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0137991.html 先通过uc_key把恶意代码保存在/uc_client/data/ca ...

  7. [SDOI2016]排列计数

    Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是 ...

  8. ●Joyoi 绿豆蛙的归宿

    题链: http://www.joyoi.cn/problem/tyvj-1933题解: 期望dp,拓扑序 定义dp[i]表示从i点到N点的期望距离. 令cnt[u]表示u的出度. 显然$$dp[u] ...

  9. POJ2774 很长的信息

    Description Little cat在Byterland的首都读物理专业.这些天他收到了一条悲伤地信息:他的母亲生病了.担心买火车票花钱太多(Byterland是一个巨大的国家,因此他坐火车回 ...

  10. 【bzoj4572 scoi2016】围棋

    题目描述 近日,谷歌研发的围棋AI—AlphaGo以4:1的比分战胜了曾经的世界冠军李世石,这是人工智能领域的又一里程碑. 与传统的搜索式AI不同,AlphaGo使用了最近十分流行的卷积神经网络模型. ...