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

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

上一篇:IOS第二天-新浪微博 - 添加搜索框,弹出下拉菜单 ,代理的使用 ,HWTabBar.h(自定义TabBar)


下一篇:bootstrap-js(2)下拉菜单