Как я могу включать SessionID в файлы журнала с помощью log4net в ASP.NET?

У меня была эта ошибка, когда я пытался установить значения Outlets из метода подготовки к методу segue следующим образом:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destination = segue.destination as? DestinationVC{

        if let item = sender as? DataItem{
            // This line pops up the error
            destination.nameLabel.text = item.name
        }
    }
}

Тогда я узнал, что не могу установить значения выходы контроллера контроллера, потому что контроллер еще не был загружен или инициализирован.

Поэтому я решил это следующим образом:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destination = segue.destination as? DestinationVC{

        if let item = sender as? DataItem{
            // Created this method in the destination Controller to update its outlets after it's being initialized and loaded
            destination.updateView(itemData:  item)
        }
    }
}

Destination Controller:

// This variable to hold the data received to update the Label text after the VIEW DID LOAD
var name = ""

// Outlets
@IBOutlet weak var nameLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    nameLabel.text = name
}

func updateView(itemDate: ObjectModel) {
    name = itemDate.name
}

Надеюсь, этот ответ поможет кому-то там с той же проблемой, что и я заметил, что заметный ответ - отличный ресурс для понимания опций и того, как они работают, но не затронул проблему напрямую.

24
задан John Saunders 5 June 2014 в 02:40
поделиться

3 ответа

Можно попробовать:

<conversionPattern
    value="%date %-5level %logger ${COMPUTERNAME} [%property{SessionID}] - %message%newline" />

... в Вашем Web.config, и в Global.asax.cs:

protected void Session_Start(object sender, EventArgs e)
{
    log4net.ThreadContext.Properties["SessionID"] = Session.SessionID;
    log4net.Config.XmlConfigurator.Configure();
}
1
ответ дан Richard Everett 28 November 2019 в 23:21
поделиться

ОБНОВЛЕНИЕ (2014-06-12): Начиная с log4net 1.2.11, вы можете использовать % aspnet-request {ASP.NET_SessionId } в шаблоне преобразования для этой цели.

Ссылки: https://issues.apache.org/jira/browse/LOG4NET-87 http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html


Вы должен создать обработчик Application_PostAcquireRequestState в Global.asax.cs (он вызывается в каждом запросе):

protected void Application_PostAcquireRequestState(object sender, EventArgs e)
{
    log4net.ThreadContext.Properties["SessionID"] = Session.SessionID;
}

И добавить [% property {SessionID}] в conversionPattern.

15
ответ дан 28 November 2019 в 23:21
поделиться

Кто-то поправляет меня, если я ошибаюсь, но один поток ASP.NET может обрабатывать несколько сеансов, поэтому вы не можете использовать Session_Start, поскольку он вызывается один раз при запуске сеанса. Это означает, что как только другой пользователь получает доступ к веб-сайту, ваш log4net.ThreadContext может быть перезаписан новой информацией пользователя.

Вы можете поместить приведенный ниже код в Application_AcquireRequestState или создать HttpModule и сделать это в методе AcquireRequestState. AcquireRequestState вызывается, когда среда выполнения ASP.NET готова получить состояние сеанса текущего HTTP-запроса. Если вы заинтересованы в получении имени пользователя, вы можете сделать это в AuthenticateRequest, который вызывается, когда среда выполнения ASP.NET готова аутентифицировать личность пользователя (и до AcquireRequestState).

    private void AcquireRequestState(Object source, EventArgs e)
    {
        HttpApplication application = (HttpApplication)source;
        HttpContext context = application.Context;
        log4net.ThreadContext.Properties["SessionId"] = context.Session.SessionID;
     }

После этого вы можете настроить свой log4net.

5
ответ дан 28 November 2019 в 23:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: