Я заметил, что когда я жестко закодировал свойство, оно появилось в моем журнале под тегом свойств.Например, LogContext.PushProperty("UserName", "Test")
<properties>
<property key='UserName'>Test</property>
</properties>
Кроме того, я хотел бы вывести его из тега свойств и по возможности в его собственное поле.
Приемник MSSqlServer для Serilog по умолчаниюпомещает дополнительные свойства в столбец Properties
в формате XML.Однако существует способ настроить столбцы пользовательских свойств для перемещения определенных свойств в его собственные свойства.Вы можете настроить это, используя код, но поскольку вы используете конфигурацию на основе JSON в appsettings.json
, вы также можете сделать это там.
Конфигурация должна выглядеть примерно так (сокращеннаяздесь конфигурация для отображения только соответствующих частей):
"Serilog": {
"WriteTo": [
{
"Name": "MSSqlServer",
"Args": {
"connectionString": "…",
"schemaName": "AnalyticsStudio",
"tableName": "EventLogs",
"columnOptionsSection": {
"additionalColumns": [
{ "ColumnName": "UserName" }
]
}
}
}
]
}
Столбец по умолчанию настроен как varchar
, поэтому он должен работать для вашего строкового значения.
Длядля правильного заполнения пользовательского свойства см. следующие вопросы:
Кирк Ларкин предложил следующее в чате:
Из вашего объяснения до сих пор мне интересно, ожидаете ли вы увидеть UserName
в сообщении, которое регистрируется как часть того же запроса, который на самом делеподписывает вас. Если выожидая этого, этого не произойдет, потому что вызов LogContext.PushProperty
происходит до вашего вызова на что-то вроде PasswordSignInAsync
(при условии, что вы используете Identity).
Если это действительно вашВ таком случае вы должны знать, что ваше промежуточное ПО, которое устанавливает настраиваемое свойство, работает до того, как запустит любую логику вашего контроллера.Таким образом, настраиваемое свойство устанавливается до завершения входа в систему, и поэтому во время работы промежуточного программного обеспечения в качестве настраиваемого свойства добавляется пустое имя пользователя.Так что поведение совершенно правильно.Только для последующих запросов промежуточное ПО аутентификации сможет аутентифицировать пользователя до того, как ваше промежуточное ПО запустится, так что вы должны увидеть правильное имя пользователя в выходных данных журнала.
На самом деле нетхороший способ обойти это.Конечно, вы могли бы явно установить пользовательское свойство снова при входе пользователя в систему. Но я бы рекомендовал вам не делать этого, поскольку технически запрос по-прежнему вызывался без какой-либо аутентификации, поэтому не должно быть проблемой не иметь там имя пользователя.