diff -urN rsyslog-4.6.5.orig/runtime/conf.c rsyslog-4.6.5/runtime/conf.c --- rsyslog-4.6.5.orig/runtime/conf.c 2010-11-24 22:47:07.000000000 +0800 +++ rsyslog-4.6.5/runtime/conf.c 2012-08-14 08:26:25.000000000 +0800 @@ -502,6 +502,32 @@ RETiRet; } +/* Get a FileName from a outchannel + */ +rsRetVal channParseFileName(uchar* p, uchar *szBuf) +{ + DEFiRet; + size_t i; + char szChn[128]; + struct outchannel *pOch; + + ++p; /* skip '$' */ + i = 0; + /* get outchannel name */ + while(*p && *p != ';' && *p != ' ' && + i < sizeof(szChn) / sizeof(char)) { + szChn[i++] = *p++; + } + szChn[i] = '\0'; + pOch = ochFind(szChn, i); + if (pOch != NULL && + pOch->pszFileTemplate != NULL) { + strcpy(szBuf, pOch->pszFileTemplate); + } + +finalize_it: + RETiRet; +} /* Helper to cfline() and its helpers. Parses a template name * from an "action" line. Must be called with the Line pointer diff -urN rsyslog-4.6.5.orig/runtime/stream.c rsyslog-4.6.5/runtime/stream.c --- rsyslog-4.6.5.orig/runtime/stream.c 2010-11-24 22:47:07.000000000 +0800 +++ rsyslog-4.6.5/runtime/stream.c 2012-08-14 08:30:25.000000000 +0800 @@ -96,6 +96,8 @@ resolveFileSizeLimit(strm_t *pThis, uchar *pszCurrFName) { uchar *pParams; + int len; + uchar params[512] = {0}; uchar *pCmd; uchar *p; off_t actualFileSize; @@ -121,15 +123,22 @@ if(*p == ' ') { *p = '\0'; /* pretend string-end */ pParams = p+1; - } else + len = strlen(pParams); + strcpy(params, pParams); + } else { pParams = NULL; + len = 0; + } + + //拼接动态文件的名字 + strcpy(params+len, pszCurrFName); /* the execProg() below is probably not great, but at least is is * fairly secure now. Once we change the way file size limits are * handled, we should also revisit how this command is run (and * with which parameters). rgerhards, 2007-07-20 */ - execProg(pCmd, 1, pParams); + execProg(pCmd, 1, params); free(pCmd); diff -urN rsyslog-4.6.5.orig/tools/omfile.c rsyslog-4.6.5/tools/omfile.c --- rsyslog-4.6.5.orig/tools/omfile.c 2010-11-24 22:47:07.000000000 +0800 +++ rsyslog-4.6.5/tools/omfile.c 2012-08-14 08:26:17.000000000 +0800 @@ -661,19 +661,33 @@ pData->iSizeLimit = 0; /* default value, use outchannels to configure! */ switch(*p) { - case '$': - CODE_STD_STRING_REQUESTparseSelectorAct(1) - /* rgerhards 2005-06-21: this is a special setting for output-channel - * definitions. In the long term, this setting will probably replace - * anything else, but for the time being we must co-exist with the - * traditional mode lines. - * rgerhards, 2007-07-24: output-channels will go away. We keep them - * for compatibility reasons, but seems to have been a bad idea. - */ - CHKiRet(cflineParseOutchannel(pData, p, *ppOMSR, 0, OMSR_NO_RQD_TPL_OPTS)); - pData->bDynamicName = 0; + case '$': { + uchar szFileName[128] = {0}; + channParseFileName(p, szFileName); + if (szFileName[0] == '$') { + CODE_STD_STRING_REQUESTparseSelectorAct(2) + CHKiRet(cflineParseOutchannel(pData, p, *ppOMSR, 0, OMSR_NO_RQD_TPL_OPTS)); + strcpy(pData->f_fname, ""); + CHKiRet(OMSRsetEntry(*ppOMSR, 1, ustrdup(&szFileName[1]), OMSR_NO_RQD_TPL_OPTS)); + pData->bDynamicName = 1; + pData->iCurrElt = -1; /* no current element */ + CHKmalloc(pData->dynCache = (dynaFileCacheEntry**) + calloc(iDynaFileCacheSize, sizeof(dynaFileCacheEntry*))); + + } else { + CODE_STD_STRING_REQUESTparseSelectorAct(1) + /* rgerhards 2005-06-21: this is a special setting for output-channel + * definitions. In the long term, this setting will probably replace + * anything else, but for the time being we must co-exist with the + * traditional mode lines. + * rgerhards, 2007-07-24: output-channels will go away. We keep them + * for compatibility reasons, but seems to have been a bad idea. + */ + CHKiRet(cflineParseOutchannel(pData, p, *ppOMSR, 0, OMSR_NO_RQD_TPL_OPTS)); + pData->bDynamicName = 0; + } break; - + } case '?': /* This is much like a regular file handle, but we need to obtain * a template name. rgerhards, 2007-07-03 */
打补丁时,只需要进入rsyslog-4.6.5目录,然后将patch文件放在上一级,执行patch -p1 <../rsyslog-dynchannel.patch即可。此外,还向rsyslog maillist提交了一个正式的patch:
subject:add dynimic filename support for outchannel to:[email protected] From e82f42dc9eb78fd2132b875c8718151ab9218acf Mon Sep 17 00:00:00 2001 From: zhaoya <[email protected]> Date: Tue, 7 Aug 2012 08:07:12 -0700 Subject: [PATCH] add dynimic filename support for outchannel The URL: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=477351 present a FALSE BUG! Up to the newest version,rsyslogd's "outchannel [still] doesn't get variable from template"! --- runtime/stream.c | 13 +++++++++- tools/omfile.c | 63 +++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 62 insertions(+), 14 deletions(-) diff --git a/runtime/stream.c b/runtime/stream.c index bb1a0a4..49e7ec4 100644 --- a/runtime/stream.c +++ b/runtime/stream.c @@ -96,6 +96,8 @@ static rsRetVal resolveFileSizeLimit(strm_t *pThis, uchar *pszCurrFName) { uchar *pParams; + uchar params[512] = {0}; + int len; uchar *pCmd; uchar *p; off_t actualFileSize; @@ -121,15 +123,22 @@ resolveFileSizeLimit(strm_t *pThis, uchar *pszCurrFName) if(*p == ' ') { *p = '\0'; /* pretend string-end */ pParams = p+1; - } else + len = strlen(pParams); + strcpy(params, pParams); + } else { pParams = NULL; + len = 0; + } + + //脝麓陆脫露炉脤卢脦脛录镁碌脛脙没脳脰 + strcpy(params+len, pszCurrFName); /* the execProg() below is probably not great, but at least is is * fairly secure now. Once we change the way file size limits are * handled, we should also revisit how this command is run (and * with which parameters). rgerhards, 2007-07-20 */ - execProg(pCmd, 1, pParams); + execProg(pCmd, 1, params); free(pCmd); diff --git a/tools/omfile.c b/tools/omfile.c index 1a36343..a877555 100644 --- a/tools/omfile.c +++ b/tools/omfile.c @@ -333,6 +333,32 @@ rsRetVal setDynaFileCacheSize(void __attribute__((unused)) *pVal, int iNewVal) RETiRet; } +/* Get a FileName from a outchannel + */ +rsRetVal channParseFileName(uchar* p, uchar *szBuf) +{ + DEFiRet; + size_t i; + char szChn[128]; + struct outchannel *pOch; + + ++p; /* skip '$' */ + i = 0; + /* get outchannel name */ + while(*p && *p != ';' && *p != ' ' && + i < sizeof(szChn) / sizeof(char)) { + szChn[i++] = *p++; + } + szChn[i] = '\0'; + pOch = ochFind(szChn, i); + if (pOch != NULL && + pOch->pszFileTemplate != NULL) { + strcpy(szBuf, pOch->pszFileTemplate); + } + +finalize_it: + RETiRet; +} /* Helper to cfline(). Parses a output channel name up until the first * comma and then looks for the template specifier. Tries @@ -1004,19 +1030,32 @@ CODESTARTparseSelectorAct pData->iSizeLimit = 0; /* default value, use outchannels to configure! */ switch(*p) { - case '$': - CODE_STD_STRING_REQUESTparseSelectorAct(1) - /* rgerhards 2005-06-21: this is a special setting for output-channel - * definitions. In the long term, this setting will probably replace - * anything else, but for the time being we must co-exist with the - * traditional mode lines. - * rgerhards, 2007-07-24: output-channels will go away. We keep them - * for compatibility reasons, but seems to have been a bad idea. - */ - CHKiRet(cflineParseOutchannel(pData, p, *ppOMSR, 0, OMSR_NO_RQD_TPL_OPTS)); - pData->bDynamicName = 0; + case '$': { + uchar szFileName[128] = {0}; + channParseFileName(p, szFileName); + if (szFileName[0] == '$') { + CODE_STD_STRING_REQUESTparseSelectorAct(2) + CHKiRet(cflineParseOutchannel(pData, p, *ppOMSR, 0, OMSR_NO_RQD_TPL_OPTS)); + strcpy(pData->f_fname, ""); + CHKiRet(OMSRsetEntry(*ppOMSR, 1, ustrdup(&szFileName[1]), OMSR_NO_RQD_TPL_OPTS)); + pData->bDynamicName = 1; + pData->iCurrElt = -1; /* no current element */ + CHKmalloc(pData->dynCache = (dynaFileCacheEntry**) + calloc(iDynaFileCacheSize, sizeof(dynaFileCacheEntry*))); + } else { + CODE_STD_STRING_REQUESTparseSelectorAct(1) + /* rgerhards 2005-06-21: this is a special setting for output-channel + * definitions. In the long term, this setting will probably replace + * anything else, but for the time being we must co-exist with the + * traditional mode lines. + * rgerhards, 2007-07-24: output-channels will go away. We keep them + * for compatibility reasons, but seems to have been a bad idea. + */ + CHKiRet(cflineParseOutchannel(pData, p, *ppOMSR, 0, OMSR_NO_RQD_TPL_OPTS)); + pData->bDynamicName = 0; + } break; - + } case '?': /* This is much like a regular file handle, but we need to obtain * a template name. rgerhards, 2007-07-03 */ -- 1.7.4.1