Not logging

Support of Log4PostSharp

Not logging

Postby chrissie1 on Mon Aug 18, 2008 3:47 pm

I tried the code from the demo in a project I created. I didn't copy paste all of it. Just a bit.

Code: Select all
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Log4PostSharp;

namespace PostSharpLoggingC
{
    class Program
    {
        static void Main(string[] args)
        {
            int sum = Add(1, 2);
            Console.WriteLine(sum);
            Console.ReadLine();
        }

        [Log(EntryLevel = LogLevel.Debug, EntryText = "Adding {@i1} to {@i2}.", ExitLevel = LogLevel.Debug, ExitText = "Result of addition is {returnvalue}.")]
        private static int Add(int i1, int i2)
        {
            return i1 + i2;
        }
    }
}


and this in the app.config

Code: Select all
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="MainAppender" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="ALL" />
      <appender-ref ref="MainAppender" />
    </root>
  </log4net>
</configuration>


It compiles just fine and I can see the added IL-Code in reflector. AS you can see here

Code: Select all
function Program.Add(i1: Integer; i2: Integer): Integer;
begin
    if (Program.~log4PostSharp~isDebugEnabled) then
    begin
        ~args~2 := New(array[2] of TObject, ( ( i1, i2 ) ));
        Program.~log4PostSharp~log.DebugFormat(CultureInfo.InvariantCulture, 'Adding {0} to {1}.', ~args~2)
    end;
    CS$1$0000 := (i1 + i2);
    ~returnValue~1 := CS$1$0000;
    if (Program.~log4PostSharp~isDebugEnabled) then
    begin
        ~args~3 := New(array[1] of TObject, ( ( ~returnValue~1 ) ));
        Program.~log4PostSharp~log.DebugFormat(CultureInfo.InvariantCulture, 'Result of addition is {0}.', ~args~3)
    end;
    begin
        Result := ~returnValue~1;
        exit
    end
end;


But it doesn't output the log things.

However f I add this

Code: Select all
log4net.Config.BasicConfigurator.Configure();
            log4net.ILog log = log4net.LogManager.GetLogger("logger-name");
            log.Debug("test");
            Console.ReadLine();


I get the one line (nothing from log4postsharp) So I guess the configuration of log4net is correct but Log4postsharp is not picking it up.

What am I doing wrong?

LessThanDot
chrissie1
 
Posts: 2
Joined: Mon Aug 18, 2008 1:23 pm
First Name: Christiaan
Last Name: BaesNJNJ

Re: Not logging

Postby herrmic on Mon Aug 18, 2008 10:56 pm

The last of the snippets you've posted (the one using the Configurator) is very important. Not configured log4net will not do anything. Actually if you use the BasicConfigurator, the data in your app.config is ignored. You need to use XmlConfigurator to make log4net use the app.config file.

Now, I think that putting the XmlConfigurator attribute into AssemblyInfo.cs file (as opposed to configuring log4net "manually", by a method call) may solve the problem. Unfortunately I won't be able to check this myself until tomorrow evening, but if you want then you can put the following line:

Code: Select all
[assembly: XmlConfigurator(Watch = true)]


into your AssemblyInfo.cs file and see if this helps (remember to first remove other references to log4net configurators from your code).

I suspect now that the problem is caused by the way the Log4PostSharp tries to speed up accessing log4net configuration - it caches parts of it. And I guess that in your case the data gets cached before log4net has chance to be configured (so the data that goes into the cache is the default "do not log anything"). Using the XmlConfigurator attribute should work before I can fix this bug.
Regards,
Michal Dabrowski
http://herrmic-coding.blogspot.com/
herrmic
 
Posts: 20
Joined: Sat Jan 12, 2008 4:55 pm
First Name: Michal
Last Name: Dabrowski

Re: Not logging

Postby chrissie1 on Tue Aug 19, 2008 12:50 pm

Yep that worked.

I will be making a blogpost about this in a hou or so.
But this time in VB.Net.

You can find it at http://blogs.lessthandot.com
chrissie1
 
Posts: 2
Joined: Mon Aug 18, 2008 1:23 pm
First Name: Christiaan
Last Name: BaesNJNJ

Re: Not logging

Postby kbafna on Sat Aug 30, 2008 4:06 pm

Hi,

I am facing the same problem i.e nothing is getting logged. I am directly running the demo application. The application assembly info file even has the XmlConfigurator attribute for the Log4net.

My IL code in the reflector looks something like this:

Code: Select all
.class public auto ansi beforefieldinit Program
    extends [mscorlib]System.Object
{
    .method public hidebysig specialname rtspecialname instance void .ctor() cil managed
    {
        .maxstack 8
        L_0000: ldarg.0
        L_0001: call instance void [mscorlib]System.Object::.ctor()
        L_0006: ret
    }

    .method private hidebysig static int32 Add(int32 i1, int32 i2) cil managed
    {
        .custom instance void [Log4PostSharp]Log4PostSharp.LogAttribute::.ctor() = { EntryLevel=int32(1) EntryText=string('Adding {@i1} to {@i2}.') ExitLevel=int32(1) ExitText=string('Result of addition is {returnvalue}.') }
        .maxstack 2
        .locals init (
            [0] int32 CS$1$0000)
        L_0000: nop
        L_0001: ldarg.0
        L_0002: ldarg.1
        L_0003: add
        L_0004: stloc.0
        L_0005: br.s L_0007
        L_0007: ldloc.0
        L_0008: ret
    }

    .method public hidebysig static void Main(string[] args) cil managed
    {
        .entrypoint
        .maxstack 2
        .locals init (
            [0] class [log4net]log4net.ILog log,
            [1] int32 i1,
            [2] int32 i2,
            [3] int32 sum)
        L_0000: nop
        L_0001: call void [log4net]log4net.Config.XmlConfigurator::Configure()
        L_0006: nop
        L_0007: ldtoken Log4PostSharpDemo.Program
        L_000c: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
        L_0011: call class [log4net]log4net.ILog [log4net]log4net.LogManager::GetLogger(class [mscorlib]System.Type)
        L_0016: stloc.0
        L_0017: ldloc.0
        L_0018: ldstr "test"
        L_001d: callvirt instance void [log4net]log4net.ILog::Debug(object)
        L_0022: nop
        L_0023: call string [mscorlib]System.Console::ReadLine()
        L_0028: pop
        L_0029: call int32 Log4PostSharpDemo.Program::ReadNumber()
        L_002e: stloc.1
        L_002f: call int32 Log4PostSharpDemo.Program::ReadNumber()
        L_0034: stloc.2
        L_0035: ldloc.1
        L_0036: ldloc.2
        L_0037: call int32 Log4PostSharpDemo.Program::Add(int32, int32)
        L_003c: stloc.3
        L_003d: ldstr "Result is {0}."
        L_0042: ldloc.3
        L_0043: box int32
        L_0048: call void [mscorlib]System.Console::WriteLine(string, object)
        L_004d: nop
        L_004e: ret
    }

    .method private hidebysig static int32 ReadNumber() cil managed
    {
        .custom instance void [Log4PostSharp]Log4PostSharp.LogAttribute::.ctor() = { EntryLevel=int32(1) ExitLevel=int32(1) ExceptionLevel=int32(5) }
        .maxstack 2
        .locals init (
            [0] string line,
            [1] int32 CS$1$0000)
        L_0000: nop
        L_0001: ldstr "Please enter a number: "
        L_0006: call void [mscorlib]System.Console::Write(string)
        L_000b: nop
        L_000c: call string [mscorlib]System.Console::ReadLine()
        L_0011: stloc.0
        L_0012: ldloc.0
        L_0013: call class [mscorlib]System.Globalization.CultureInfo [mscorlib]System.Globalization.CultureInfo::get_CurrentCulture()
        L_0018: call int32 [mscorlib]System.Int32::Parse(string, class [mscorlib]System.IFormatProvider)
        L_001d: stloc.1
        L_001e: br.s L_0020
        L_0020: ldloc.1
        L_0021: ret
    }

}


If the custom code like the below is added to main function, it logs fine for log4net code and nothing from Log4PostSharp comes!
Code: Select all
            log4net.Config.XmlConfigurator.Configure();
            log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
            log.Debug("test");


So I also suppose that configuration is fine but Log4PostSharp is not loading the configuration.
We are planning to use the Log4PostSharp in our project.
So its bit urgent.

Thanks in advance.
kbafna
 
Posts: 2
Joined: Sat Aug 30, 2008 3:45 pm
First Name: Kamlesh
Last Name: Bafna
Company: Ness Tech

Re: Not logging

Postby herrmic on Sun Aug 31, 2008 10:00 pm

Hi,

looking at the IL you posted, the logging code did not get injected and the Log attributes were not removed. It seems that the PostSharp has not been executed during the compilation. Do you have PostSharp installed in your system (I mean the full installation that integrates with the MSBuild process)? If yes, does the build output contain lines like the ones below?

Code: Select all
...
Compile complete -- 0 errors, 0 warnings
...
PostSharp 1.0 [1.0.10.403] - Copyright (c) Gael Fraiteur, 2005-2008.
...
Regards,
Michal Dabrowski
http://herrmic-coding.blogspot.com/
herrmic
 
Posts: 20
Joined: Sat Jan 12, 2008 4:55 pm
First Name: Michal
Last Name: Dabrowski

Re: Not logging

Postby kbafna on Mon Sep 01, 2008 8:44 am

Hi

Thanks the problem is solved.
I uninstalled my PostSharp & installed it again with Global configuration for MS Setup Build.
I was initially reluctant to install with Global build as i didnt want to associate PostSharp with all my existing projects which are not using PostSharp.

Is there any way I can use Log4Postsharp in my specific project without installing the Post Sharp with Global configuration for MS Setp Build.

Thanks once again.
kbafna
 
Posts: 2
Joined: Sat Aug 30, 2008 3:45 pm
First Name: Kamlesh
Last Name: Bafna
Company: Ness Tech

Re: Not logging

Postby herrmic on Mon Sep 01, 2008 9:14 am

Hi,

sure there is. PostSharp chm documentation contains chapter: "PostSharp 1.0 / User Guide / Using the PostSharp Platform / Enabling or Disabling PostSharp". It describes how to configure your VS projects to use PostSharp without installing it globally (the "Enabling PostSharp On A Per-Project Basis" section).

With this setup, you may also want to consider downloading the "Binary - No Installer" package from http://www.postsharp.org/download/1.0/, adding the PostSharp binaries to your source code tree and referring it from there.

As a side note, this is how I enable PostSharp in my other projects.
Regards,
Michal Dabrowski
http://herrmic-coding.blogspot.com/
herrmic
 
Posts: 20
Joined: Sat Jan 12, 2008 4:55 pm
First Name: Michal
Last Name: Dabrowski

Re: Not logging

Postby ankitpuranik on Tue Sep 09, 2008 7:24 am

Hi,

I'm facing problem in logging from the application which is installed through an .msi file. When I build the application through VS.NET and then run it, it works perfectly well. But when I create the setup (.msi) file of my project, and then install it on my default website, it doesnot work.

I've done following settings in AssemblyInfo.cs files:

[assembly: XmlConfigurator(Watch = true)]

[assembly: Log(AttributeTargetTypes = "*", EntryLevel = LogLevel.Debug, ExitLevel = LogLevel.Debug, ExceptionLevel = LogLevel.Error)]

And my web.config and app.config file settings looks like:

<log4net>
<appender name="MainAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="QMSLog.txt" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="10" />
<param name="MaximumFileSize" value="100KB" />
<param name="RollingStyle" value="Size" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="MainAppender" />
</root>
</log4net>

Please tell me where's the problem? Is it in the way I'm coding or something else?
ankitpuranik
 
Posts: 5
Joined: Tue Sep 09, 2008 7:14 am
First Name: Ankit
Last Name: Puranik

Re: Not logging

Postby herrmic on Tue Sep 09, 2008 11:48 am

Hi,

your configuration and attributes seem to be correct. Could you confirm with the Reflector that the DLL files you distribute are woven correctly (i.e. contain the logging code)?

Can you also check if you are able to log events "manually", i.e. by instantiating a logger yourself in one of your methods and using it?
Regards,
Michal Dabrowski
http://herrmic-coding.blogspot.com/
herrmic
 
Posts: 20
Joined: Sat Jan 12, 2008 4:55 pm
First Name: Michal
Last Name: Dabrowski

Re: Not logging

Postby ankitpuranik on Tue Sep 09, 2008 12:03 pm

Hi,

I've tested in the reflector. The code is getting injected but still I'm not getting the log file when the application is installed through .msi file.

As I told you it perfectly works when I run the application through VS.NET 2008 and according to my settings RollingFileAppender logic also works fine. Cant understand the problem with .msi file.
Has it anything to do with .NET 3.5?

Thanks
Ankit
ankitpuranik
 
Posts: 5
Joined: Tue Sep 09, 2008 7:14 am
First Name: Ankit
Last Name: Puranik

Re: Not logging

Postby herrmic on Tue Sep 09, 2008 12:41 pm

One of my applications also uses Log4PostSharp, runs under .NET 3.5 and is packaged as MSI installer. Everything runs fine there - so at least your problem is not caused by the framework version or packaging method.

Did you check if you are able to log anything "manually"? Just put the following lines into one of your methods:
Code: Select all
var log = LogManager.GetLogger(typeof (object));
log.Info("Test.");
and make sure the method gets executed. Does the "Test." message get logged then? If you could check this, it would be very helpful for me.

I think that the problem may be related to log4net initialization. Log4PostSharp caches some values from log4net configuration and in some scenarios this caching may occur before the configuration is loaded (so that default, uninitialized values get cached). I plan to solve this issue in the next few days.
Regards,
Michal Dabrowski
http://herrmic-coding.blogspot.com/
herrmic
 
Posts: 20
Joined: Sat Jan 12, 2008 4:55 pm
First Name: Michal
Last Name: Dabrowski

Re: Not logging

Postby ankitpuranik on Tue Sep 09, 2008 6:35 pm

Hi,

I've injected the piece of code that you provided but still no log file was created. According to my understand, since i haven't provided the path of the file it should be created in the bin folder, but its not there.

Any feedback on this situation?

Thanks
Ankit
ankitpuranik
 
Posts: 5
Joined: Tue Sep 09, 2008 7:14 am
First Name: Ankit
Last Name: Puranik

Re: Not logging

Postby ankitpuranik on Wed Sep 10, 2008 9:41 am

Hi,

I've again tried to do it manually. My only problem is the log file (QMSLog.txt in my case) is not getting created when I run my application through setup(.msi file). I've seen in ILDASM, that the code is getting injected in the file.

Just need the log file.

Thanks
Ankit
ankitpuranik
 
Posts: 5
Joined: Tue Sep 09, 2008 7:14 am
First Name: Ankit
Last Name: Puranik

Re: Not logging

Postby ankitpuranik on Fri Sep 12, 2008 9:22 am

Hi Michal,

Can you please suggest some workaround so that we can start logging through our msi file? As we need to deploy our application very soon, we need to sort out this problem very quickly.

Thanks
Ankit
ankitpuranik
 
Posts: 5
Joined: Tue Sep 09, 2008 7:14 am
First Name: Ankit
Last Name: Puranik

Re: Not logging

Postby herrmic on Fri Sep 12, 2008 11:54 am

Hi,

I've again tried to do it manually. My only problem is the log file (QMSLog.txt in my case) is not getting created when I run my application through setup(.msi file)


If you can't get logging to work even if you log manually, then I think the issue is unrelated to Log4PostSharp. I would suggest you checking you that:
  • the assembly containing the method that does the first logging is decorated with the XmlConfigurator attribute,
  • your application has enough security permissions to write to the directory where you want to store the log (I guess this depends on how IIS is configured).
Regards,
Michal Dabrowski
http://herrmic-coding.blogspot.com/
herrmic
 
Posts: 20
Joined: Sat Jan 12, 2008 4:55 pm
First Name: Michal
Last Name: Dabrowski


Return to Log4PostSharp