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. [LeetCode] Max Chunks To Make Sorted 可排序的最大块数

    Given an array arr that is a permutation of [0, 1, ..., arr.length - 1], we split the array into som ...

  2. Javasript设计模式之链式调用

    写过jquery的可能都知道,jquery里面可以很方便的使用以下代码: // 不使用链式调用 const element = $(ele); element.addClass('red'); ele ...

  3. [HNOI 2017]礼物

    Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在 ...

  4. [ZJOI2008]生日聚会

    题目描述 今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party. hidadz带着朋友们来到花园中,打算坐成一排玩游戏.为了游戏不至于无聊,就座的方案应满足如下条件: 对于任意连续 ...

  5. [HNOI2014]画框

    题目描述 小T准备在家里摆放几幅画,为此他买来了N幅画和N个画框.为了体现他的品味,小T希望能合理地搭配画与画框,使得其显得既不过于平庸也不太违和. 对于第 幅画与第 个画框的配对,小T都给出了这个配 ...

  6. 计蒜客NOIP模拟赛4 D1T2小X的密室

    小 X 正困在一个密室里,他希望尽快逃出密室. 密室中有 N 个房间,初始时,小 X 在 1 号房间,而出口在 N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会单向地创造一条 ...

  7. [USACO09FEB]改造路Revamping Trails

    题目描述 Farmer John dutifully checks on the cows every day. He traverses some of the M (1 <= M <= ...

  8. Thinkphp中的 I 函数(Thinkphp3.2.3版本)

    I 函数的作用是获取系统变量,必要时还可以对变量值进行过滤及强制转化,I 函数的语法格式: I('变量类型.变量名/修饰符',['默认值'],['过滤方法或正则'],['额外数据源']) 一.获取变量 ...

  9. js黑魔法

    清空一个数组 一直以来,清空一个数组都是var i = [1,2,3]; i = [];,习惯成自然,被自己坑了. 举个例子 var i = [1,2,3]; var obj = {val: i}; ...

  10. PTA 字符串关键字的散列映射(25 分)

    7-17 字符串关键字的散列映射(25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义的散列函数H(Key)将关键字Key中的最后3个字符映射为整数,每个字符占5位:再用除留余 ...