IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    金庆发表于 2016-12-05 07:31:00
    love 0
    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


    金庆 2016-12-05 15:31 发表评论


沪ICP备19023445号-2号
友情链接