"Inheritance security rules violated" when running project with Ninject.Extensions.Logging.Log4Net? - c#

I have an application I'm working on with references to log4net, Ninject, Ninject.Extensions.Logging, and Ninject.Extensions.Logging.Log4net. When I attempt to run the application, I receive an exception:
{"Inheritance security rules violated by type: 'Ninject.Extensions.Logging.LoggerModuleBase'. Derived types must either match the security accessibility of the base type or be less accessible.":"Ninject.Extensions.Logging.LoggerModuleBase"}
I'm completely new to Ninject and the logging extension. I've seen several suggestions around that involve adding something like:
[assembly: System.Security.SecurityRules(System.Security.SecurityRuleSet.Level1)]
But I fail to see what the actual problem is and why I should need to modify release source code to coalesce with my application. Thus, I am under the assumption that I am doing something wrong. What could the problem possibly be?
For more information, the application is built targeting .Net 4 instead of the .Net 4 Client Profile, I've tried targeting both the Client Profile and the full .Net 4 framework while building the extension, but neither has worked.
I'm building the release version of the extension using the provided .sln file (not the nAnt build file). The extension project can be found on Github.
I'm running Visual Studio 2010.
My kernel is built like so:
private static StandardKernel kernel;
public static StandardKernel Kernel
{
get
{
return kernel;
}
}
public static void BuildKernel()
{
var settings = new NinjectSettings
{
LoadExtensions = false
};
var modules = new INinjectModule[]
{
new MainModule(),
new Log4NetModule()
};
kernel = new StandardKernel(settings, modules);
}
My log4net configuration is rather basic, but here is my full app.Config file:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="lib" />
</assemblyBinding>
</runtime>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<appender name="BasicAppender" type="log4net.Appender.FileAppender">
<threshold value="Warn"/>
<file value="Logs/errorlog.txt"/>
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<header value="[Basic Appender]
" />
<footer value="[Basic Appender]
" />
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] <%property{auth}> - %message%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="BasicAppender" />
</root>
</log4net>
</configuration>

I'm still unsure what caused the error, but update to the version available via Nuget fixed it. https://www.nuget.org/packages/Ninject.Extensions.Logging.Log4net/3.0.1

Related

Specific log4net-logfile for PayPal

Is it possible to specify the logfile in the App.config?
I found these parameters in .NET:
https://github.com/paypal/sdk-core-dotnet/wiki/SDK-Configuration-Parameters
In PHP it seems to be possible (Logging):
https://github.com/paypal/sdk-core-php/wiki/Configuring-the-SDK
Now, the informations will be saved in the first of many stated logfiles.
Yes, it is possible to specify the logfile in your config. The PayPal .NET SDK wiki shows what information you need to add to your config file:
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<!-- log4net settings -->
<log4net>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="my_app.log"/>
<appendToFile value="true"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] %message%newline"/>
</layout>
</appender>
<root>
<level value="DEBUG"/>
<appender-ref ref="FileAppender"/>
</root>
</log4net>
<!--
App-specific settings. Here we specify which PayPal logging classes are enabled.
PayPal.Log.Log4netLogger: Provides base log4net logging functionality
PayPal.Log.DiagnosticsLogger: Provides more thorough logging of system diagnostic information and tracing code execution
-->
<appSettings>
<!-- Diagnostics logging is only available in a Full Trust environment. -->
<!-- <add key="PayPalLogger" value="PayPal.Log.DiagnosticsLogger, PayPal.Log.Log4netLogger"/> -->
<add key="PayPalLogger" value="PayPal.Log.Log4netLogger"/>
</appSettings>
</configuration>
Replace my_app.log with your own logfile name.

Log4Net Not Writing to Output File

I'm having serious trouble getting log4net to work with a Windows service (multi-project solution).
I first added reference to log4net.dll to the appropriate projects via NuGet. I then created a new Log4Net.config file in the root folder of the Windows service project. In the file's properties, I set Copy to Output Directory = Copy always. Below is the config file:
<?xml version="1.0"?>
<configuration>
<log4net>
<appender name="TestServiceLog" type="log4net.Appender.RollingFileAppender">
<file value="C:\Temp\Test.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="100" />
<maximumFileSize value="10MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
<root>
<level value="INFO" />
<priority value="ALL" />
<appender-ref ref="TestServiceLog" />
</root>
</log4net>
</configuration>
In my Windows service project, in the AssemblyInfo.cs file, I added this line:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
In my main TestService.cs class, I referenced log4net and initialized the logger like so (omitted non-logging code):
public partial class TestService : ServiceBase
{
private ILog Log { get; set; }
protected override void OnStart(string[] args)
{
Log = LogManager.GetLogger(this.GetType());
Log.Info("Hear me log.");
}
}
I then installed and ran the service. I validated the service is running normally, but no log file is created/written to. No exceptions are being thrown. Everything appears in order when debugging. I turned on log4net's internal debugging and got this:
log4net: Creating repository for assembly [TestService, Version=3.6.5570.17497, Culture=neutral, PublicKeyToken=null]
log4net: Assembly [TestService, Version=3.6.5570.17497, Culture=neutral, PublicKeyToken=null] Loaded From [C:\ProgramData\Company\Applications\TestService\TestService\TestService.exe]
log4net: Assembly [TestService, Version=3.6.5570.17497, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified.
log4net: Assembly [TestService, Version=3.6.5570.17497, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: repository [log4net-default-repository] already exists, using repository type [log4net.Repository.Hierarchy.Hierarchy]
The output does not seem to hint at any issues. I've also tried adding the following line to my configuration, but it didn't do the trick:
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/>
I added a WinForms project to the solution with the exact same configuration and logging worked fine, so I'm confident it's not my setup. Any other ideas on steps I may have missed?
I was able to get it to work by making the Log variable static and instantiating it like this:
private static ILog Log = LogManager.GetLogger(typeof(TestService));
I'm not quite sure why this was necessary. Hopefully someone else knows the answer.

Log4Net doesn’t write log in release mode - Console Application

I have a console application and have a class library which wraps the Log4Net methods. Now when run the application in debug mode it writes log but when it is built in release mode it doesn’t write log file. What would be the solution for this? The sample code and config file is given below
My development environment is
Visual Studio 2013 and .NET Framework 4.5
Console Application
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
log4net.GlobalContext.Properties["LogFileName"] = "TestLogin.txt";
Logger log = new Logger(typeof(Program));
log.Info("Logging is enabled!!");
}
}
}
App.config in Console Application
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value ="%property{LogFileName}"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level - %message%newline%exception" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="RollingFileAppender" />
</root>
</log4net>
</configuration>
Class Library
using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace Logging
{
public class Logger
{
private readonly ILog log = null;
public Logger(Type type)
{
log = LogManager.GetLogger(type);
}
public void Info(object message)
{
log.Info(message);
}
}
}
I have followed the post and it didn’t help me to figure out why Log4Net doesn’t write in log file in release mode?
log4net doesn't log when running a .Net 4.0 Windows application built in Release mode
There are a few workarounds for this.
You could add the [MethodImpl(MethodImplOptions.NoInlining)]
attribute to your Logger constructor methods in your class library.
You could add [assembly: log4net.Config.XmlConfigurator(Watch =
true)] to AssemblyInfo.cs in your Console Project (not the class library project)
You can add log4net.Config.XmlConfigurator.Configure(); at the
start of your Logger constructor.
I think the reason this is happening is that in release mode, your class library is inlined and so when log4net attempts to find the attribute, it thinks the calling assembly is your exe which does not contain the attribute.
PS.
I presume you are aware that your Logger class will mean that you lose the ability to filter by method names, as log4net will only see the Logger.Info method name.
The line [assembly: log4net.Config.XmlConfigurator(Watch = true)] should be added to your AssemblyInfo.cs file in the Properties folder.
For users with an MVC app that already have the lines [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] in AssemblyInfo.cs and log4net.Config.XmlConfigurator.Configure(); in Global.asax.cs, but it's still not writing, make sure that the Application Pool user has permissions to write to the location where you're writing the log.
To get around this, I simply created a log directory on the IIS server NOT inside inetpub, gave it adequate permissions (I suppose it can be "Everyone", "Full Control" if it's just a child log directory and you're feeling lazy), and wrote the full path in the log4net.config (or Web.config, if you didn't isolate it).
Here's my config file:
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<root>
<level value="ALL"/>
<appender-ref ref="RollingFileAppender"/>
</root>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:/absolute/path/to/logfile.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maximumFileSize value="10MB"/>
<datePattern value="yyyyMMdd'-FULL.log'" />
<maxSizeRollBackups value="-1"/>
<staticLogFileName value="false"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
</log4net>
</configuration>
Make sure that the log4net.config file is added in your final release binary and corresponds to the path mentioned in ConfigFile = "log4Net.config".
I had the same problem, then I realized that I was simply missing out this config file in my release binary.
I have this in my Logging.dll and my Program.exe assembly.cs. Then it works in both debug and release mode. My program is a windows service.
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

Log4Net doesn't log when deployed

I'm using log4net to log my application (This is a WPF application).
The logging works well in debug mode, but it doesn't work with my deployed version.
The application is installed in C:\Program Files (x86)\MyApp (I use InnoSetup to create the installer).
In debug mode, the log folder is well created and the log files too.
In the deployed version, nothing appears, the log folder isn't created.
Here is my log4net configuration:
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
<log4net>
<appender name="FileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log\main.log" />
<encoding value="utf-8" />
<appendToFile value="true" />
<maximumFileSize value="1000KB" />
<maxSizeRollBackups value="0" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger: %message%newline" />
</layout>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="FileAppender" />
</root>
</log4net>
</configuration>
This is how I write in logs in my classes (this example is from App.xaml.cs):
protected static readonly ILog log = LogManager.GetLogger(typeof(App));
static App()
{
log4net.Config.XmlConfigurator.Configure();
}
private void Application_Startup(object sender, StartupEventArgs e)
{
log.Info("This is an info log");
}
I've tried to change the level value to ALL, but nothing changes.
I think it may be a parameter to set, because it works well in debug mode (the logs files are properly created in the folder "x86\Debug\log\".
I've made some researches but I found nothing about that.
Sounds like a a permissions issue: Directory permissions (and UAC) will prevent your app from writing to anything below C:\Program Files (x86), unless you run it as admin. Change the log path to somewhere else, for instance ${LOCALAPPDATA}\MyApp\MyApp.log
Can you right click "C:\Program Files (x86)\MyApp" folder, Properties _> Securities and add the user you are running application with to Write privileges?
Or if you right click on you app and "Run as Administrator"?
Does it make difference?

Issue using .net 2.0 Logger Class

I have been trying to use the class located here . But I have not been able to get this to work. I obviously do not understand something correctly, But I am curious how to get that example Logger class to work.
My research has sent me towards using MSBuild but the use of MSBuild correctly is still baffeling me. Any pointers would be helpful. I have built the logger class into a .dll,and referenced it in the project as well, but that is where my research seemed to run dry with helpful information.
My goal currently is just to get the above noted logger class working so I can use my own logger class.
That class is specifically for logging MSBuild events. If you want a generic logger that has nothing to do with MSBuild look at some of these alternatives:
MS Enterprise Library - Logging Application Block
Log4Net
Elmah (designed for logging ASP.NET errors, but can be used to log other events)
NLog
Don't be afraid of using a library to do the work. In the tutorial here for log4net it's a simple seven step process to start using a fully functional and scalable logging library. I'm going to inline pieces of the tutorial just in case the link ever dies.
First you build a very simple configuration section in your App.config file:
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net"/>
</configSections>
<log4net>
<root>
<level value="DEBUG" />
<appender-ref ref="LogFileAppender" />
</root>
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
<param name="File" value="log-file.txt" />
<param name="AppendToFile" value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
</log4net>
</configuration>
For your needs you pretty much just need to change the value of the first param named File as it's already setup to append to a text file.
Next you'll need to run the configuration in some startup method, like Application_Start or the main method of your program.
log4net.Config.XmlConfigurator.Configure();
Finally, just use it by plugging in a couple of lines:
private static readonly ILog log = LogManager.GetLogger(typeof(Bar));
... (rest of class)
... (somewhere in a method) ... log.Debug("this is the first log message");

Categories

Resources