Где я могу записать свой лог-файл log4net в ClickOnce? - PullRequest
9 голосов
/ 16 апреля 2009

Когда я запускаю приложение локально, оно без проблем записывает мой журнал log4net в папку, которую я настроил (т. Е. <file value="${LOCALAPPDATA}\TEST\Logs\debug.log" />). Однако при развертывании приложения через ClickOnce файл журнала не записывается.

Я знаю, что приложения ClickOnce ограничены в плане того, куда они могут писать, но у меня сложилось впечатление, что LOCALAPPDATA (например, C: \ Users \ me \ AppData \ Local) была честной игрой.

Есть идеи?

Ответы [ 2 ]

15 голосов
/ 25 апреля 2009

В ClickOnce правила папок несколько отличаются от обычных приложений Windows. Папка с данными, в которой развернуты файлы контента ClickOnce, находится в каталоге c: \ Users \ me \ Local Settings \ Apps \ 2.0 \ Data. Под этой папкой есть пара уровней подпапок с довольно загадочными идентификаторами.

Таким образом, фактическую папку данных для данного приложения ClickOnce лучше всего извлекать с использованием класса ApplicationDeployment . Вам также следует проверить свойство IsNetworkDeployed, чтобы убедиться, что вы работаете в развернутом режиме:

if (ApplicationDeployment.IsNetworkDeployed)
{
    var dataDirectory = ApplicationDeployment.CurrentDeployment.DataDirectory;
    ...
}

Поскольку DataDirectory определяется ClickOnce, вы не можете жестко закодировать этот путь в конфигурацию log4net. Мое предложение было бы изменить пути к файлам программно при запуске приложения.

foreach(var appender in LogManager.GetRepository().GetAppenders())
{
    var fileAppender = appender as FileAppender;
    if (fileAppender != null)
    {
        fileAppender.File = 
            fileAppender.File.Replace("${LOCALAPPDATA}", dataDirectory);
        fileAppender.ActivateOptions();
    }
}
3 голосов
/ 16 апреля 2009
...