2626using log4net . Repository ;
2727using log4net . Config ;
2828using log4net . Util ;
29+ using log4net . Core ;
30+ using System . IO ;
31+ using System . Linq ;
2932
3033namespace log4net . Tests . Appender ;
3134
@@ -100,4 +103,49 @@ public void FilenameWithPatternStringTest()
100103
101104 static void LogReceived ( object ? source , LogReceivedEventArgs e ) => Assert . Fail ( e . LogLog . Message ) ;
102105 }
106+
107+ /// <summary>
108+ /// Verifies that the <see cref="FileAppender.File"/> property accepts a <see cref="PatternString"/> with a <see cref="GlobalContext"/>
109+ /// </summary>
110+ /// <remarks>see https://github.com/apache/logging-log4net/issues/193</remarks>
111+ [ Test ]
112+ public void FilenameWithGlobalContextPatternStringTest ( )
113+ {
114+ DirectoryInfo logs = new ( "./Logs" ) ;
115+ if ( logs . Exists )
116+ {
117+ logs . Delete ( true ) ;
118+ }
119+
120+ XmlDocument log4netConfig = new ( ) ;
121+ log4netConfig . LoadXml ( """
122+ <log4net>
123+ <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
124+ <layout type="log4net.Layout.PatternLayout">
125+ <conversionPattern value="%date{ABSOLUTE} [%logger] %level - %message%newline%exception"/>
126+ </layout>
127+ </appender>
128+ <appender name="GeneralFileAppender" type="log4net.Appender.FileAppender">
129+ <file type="log4net.Util.PatternString" value="Logs\file_%property{LogName}_%date{yyyyMMddHHmmss}.Log"/>
130+ <appendToFile value="true"/>
131+ <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
132+ <layout type="log4net.Layout.PatternLayout">
133+ <conversionPattern value="%date{ABSOLUTE} [%logger] %level - %message%newline%exception"/>
134+ </layout>
135+ </appender>
136+ <root>
137+ <level value="INFO"/>
138+ <appender-ref ref="GeneralFileAppender"/>
139+ </root>
140+ </log4net>
141+ """ ) ;
142+ ILoggerRepository rep = LogManager . CreateRepository ( Guid . NewGuid ( ) . ToString ( ) ) ;
143+ // latest possible moment to set GlobalContext property used in filename
144+ GlobalContext . Properties [ "LogName" ] = "custom_log_issue_193" ;
145+ XmlConfigurator . Configure ( rep , log4netConfig [ "log4net" ] ! ) ;
146+ ILogger logger = rep . GetLogger ( nameof ( FilenameWithGlobalContextPatternStringTest ) ) ;
147+ logger . Log ( GetType ( ) , Level . Info , nameof ( FilenameWithGlobalContextPatternStringTest ) , null ) ;
148+ logs . Refresh ( ) ;
149+ Assert . IsTrue ( logs . GetFiles ( ) . Any ( file => file . Name . StartsWith ( "file_custom_log_issue_193" ) ) ) ;
150+ }
103151}
0 commit comments