Очевидно, что PatternString можно использовать только для создания имен журналов (т. Е. Имен файлов и т. Д.), Тогда как макет позволяет форматировать реальное сообщение, которое попадает в журнал.Если в макете процесса нет встроенного шаблона для идентификатора процесса, его можно легко добавить.Это гораздо проще, чем создавать весь макет.
Вот как это сделать:
Создайте свой собственный конвертер шаблонов (пример ниже пытается получить имя приложения независимо от того, выиграл он или нет)web):
internal sealed class ApplicationNamePatternConverter : PatternLayoutConverter
{
/// <summary>
/// Write the event application name to the output
override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
{
string name = string.Empty;
if( System.Web.HttpContext.Current != null )
{
string[] applicationPath = System.Web.HttpContext.Current.Request.ApplicationPath.Split('/');
name = applicationPath[applicationPath.Length - 1];
}
else
{
if( System.Reflection.Assembly.GetEntryAssembly() != null )
{
name = System.Reflection.Assembly.GetEntryAssembly().GetName().Name;
}
}
writer.Write(name);
}
}
Добавьте запись для вашего конвертера в реестр класса PatternLayout
static PatternLayout()
{
...
s_globalRulesRegistry.Add("ApplicationName", typeof(ApplicationNamePatternConverter));
}
Теперь вы можете использовать %ApplicationName
в значении PatternLayout, чтобы получить то, что вам нужно.
Я бы посоветовал не использовать макет XmlLayoutSchemaLog4j
, поскольку он очень тяжелый и может снизить производительность вашего приложения при частом использовании.