log4net Mysql logging not working in my .net 3.5 application - mysql

I have a application where simple text file logging is working fine. now i also needed to logging in mysql database.
But nothing happened after my log entries of code.
My log4net configuration is
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<immediateFlush value="true" />
<bufferSize value="1" />
<connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data, Version=6.4.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
<connectionString value="data source=localhost;initial catalog=mytestdb;User ID=root;Password=" />
<commandText value="INSERT INTO system_log(thread,level,appname,message,action) VALUES (?thread, ?level, ?appname, ?message, ?action)" />
<parameter>
<parameterName value="thread" />
<dbType value="String" />
<size value="100" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%t" />
</layout>
</parameter>
<parameter>
<parameterName value="level" />
<dbType value="String" />
<size value="10" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%p" />
</layout>
</parameter>
<parameter>
<parameterName value="appname" />
<dbType value="String" />
<size value="10" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="My Web Service" />
</layout>
</parameter>
<parameter>
<parameterName value="message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%m" />
</layout>
</parameter>
<parameter>
<parameterName value="action" />
<dbType value="String" />
<size value="45" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%5c{1}.%M" />
</layout>
</parameter>
<filter type="log4net.Filter.LevelRangeFilter">
<acceptOnMatch value="true" />
<levelMin value="DEBUG" />
<levelMax value="FATAL" />
</filter>
</appender>
<!--<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender" >
<file value="..\\Logs.txt" />
<appendToFile value="true" />
<datePattern value="yyyyMMdd" />
<rollingStyle value="Date" />
<filter type="log4net.Filter.LevelRangeFilter">
<acceptOnMatch value="true" />
<levelMin value="DEBUG" />
<levelMax value="FATAL" />
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{yyyy-MM-dd HH:mm:ss.fff} %10p %-5property{_App} %-5property{_Node} [%2t] %5c{1}.%M - %m%n" />
</layout>
</appender>-->
<root>
<level value="ALL" />
<!--<appender-ref ref="RollingLogFileAppender" />-->
<appender-ref ref="AdoNetAppender" />
</root>
</log4net>

In current configuration buffersize was initially set to 100.. So I have to set it to 0 or 1 so that log4net immediately send message.
<bufferSize value="0" />
Second Problems was i were using commandparamter in wrong way
I have set it to
<commandText value="INSERT INTO system_log(thread_id,level,appname,message,action) VALUES (#threadParam,#levelParam,#appnameParam,#messageParam,#actionParam);" />
which works

Related

log4net - conversionPattern per level for single FileAppender?

While it is not difficult to setup different log files, each with a different conversionPattern, per level, I would like to have minimal logging for all but errors, where I'd like a detailed log entry. Here's a snippet of my current configuration:
<appender name="WarningsAndBelowFileAppender" type="log4net.Appender.FileAppender">
<file value="log.txt" />
<appendToFile value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%m%n" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMax value="WARN" />
</filter>
</appender>
<appender name="ErrorsFileAppender" type="log4net.Appender.FileAppender">
<file value="errors.txt" />
<appendToFile value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
<threshold value="ERROR" />
</appender>
I'd love to have both of these configurations go into a single log file, just have different conversionPatterns for each. Can this be done?
you can't do it within the config file but you can make it with pattern layout converter.
See information here
This should be the converted code:
class MyMessageConverter : PatternLayoutConverter
{
protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
{
if (loggingEvent.Level.Value <= Level.Warn.Value)
{
writer.Write(loggingEvent.RenderedMessage);
}
else
{
writer.Write("{0} [{1}] {2,5} {3} - {4}",
loggingEvent.TimeStamp,
loggingEvent.ThreadName,
loggingEvent.Level.Name,
loggingEvent.LocationInformation.ClassName,
loggingEvent.RenderedMessage);
}
}
}
And here is the config file:
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="log.txt" />
<appendToFile value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%MSG%n" />
<converter>
<name value="MSG" />
<type value="yournamespace.MyMessageConverter " />
</converter>
</layout>
</appender>

Log4net Json custom properties not being read

I am inserting JSON format data in sql database using log4net. Everything is fine except custom properties which are not being saved.
This is my configuration:
<appender name="TGGADONetAppenderjson" type="log4net.Appender.ADONetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="Data Source=LOANER-1122-HP\SQLEXPRESS;Initial Catalog=CAS-Dev;integrated security=false;persist security info=True;User Id=sa;Password=abinash12345;" />
<commandText value="INSERT INTO Log ([Message],[AppName],[TransactionId]) VALUES
(#message, #appName,#transactionId)" />
<parameter>
<parameterName value="#message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.SerializedLayout, log4net.Ext.Json"></layout>
</parameter>
<parameter>
<parameterName value="#appName" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.PatternLayout">
<!--<conversionPattern value="%property{Environment}" />-->
<conversionPattern value="APPNAME-LogTest" />
<!--should be a fixed value-->
</layout>
</parameter>
<parameter>
<parameterName value="#transactionId" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.PatternLayout" >
<conversionPattern value="%property{TransactionId}" />
</layout>
</parameter>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="TGGADONetAppenderjson" />
</root>
When I debug, I can see the values of the custom property "TransactionId" is being put into the thread. However the insert does not work. The TransactionId is not logged in the message nor inserted into the column TransactionId.
I am using log4net json version 1.2.13.29 from NuGet
There's some more configuration to go into the SerializedLayout. You need to explicitly name the property. Try something like:
<layout type='log4net.Layout.SerializedLayout, log4net.Ext.Json'>
<decorator type='log4net.Layout.Decorators.StandardTypesDecorator, log4net.Ext.Json' />
<default /> <!-- explicit default members -->
<member value='TransactionId' /> <!-- explicit property reference -->
</layout>
Check the Members test case that might help you.
Alternatively, serialize all the properties by adding a properties member.

Logging into the file in Mule ESB

Can logging be done into the file in MULE ESB?.If so,please give me some examples and code snippets.Thanks in advance
Narayanan
You need to put log4j properties in your mule project inside main/resources directory. Here's sample log4j.xml that I am using with mule esb.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss} %-5p [%t] [%c] - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="FATAL" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<appender name="file" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="${mule.home}/logs/test.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<param name="Append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss} %-5p [%t] [%c] - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="FATAL" />
<param name="AcceptOnMatch" value="true" />
</filter>
</appender>
<root>
<priority value="DEBUG" />
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
</log4j:configuration>
Use the below log4j.xml file. Name the files as log4j.xml place it in the mule project classpath so that mule will pick this file when starting the app.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n" />
</layout>
</appender>
<appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="c:/logs/gid/gid.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n" />
</layout>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="FILE" />
</root>
</log4j:configuration>
Hope this helps you.
Thanks...
Yes we can save the entire logs in a file in any location. For that change the target(give the path where you want) in te log4j.xml file.
Since Mule 3.6 they changed the Log System from Log4j to Log4j2. Use the following content for your log4j2.xml file. Has been tested with Mule 3.8.
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%-5p %d [%t] %c: %m%n"/>
</Console>
</Appenders>
<Loggers>
<!-- CXF is used heavily by Mule for web services -->
<AsyncLogger name="org.apache.cxf" level="WARN"/>
<!-- Apache Commons tend to make a lot of noise which can clutter the log-->
<AsyncLogger name="org.apache" level="WARN"/>
<!-- Reduce startup noise -->
<AsyncLogger name="org.springframework.beans.factory" level="WARN"/>
<!-- Mule classes -->
<AsyncLogger name="org.mule" level="INFO"/>
<AsyncLogger name="com.mulesoft" level="INFO"/>
<AsyncRoot level="INFO">
<AppenderRef ref="Console"/>
</AsyncRoot>
</Loggers>
</Configuration>

Cannot insert into MSSQL table with Log4Net

I am testing Log4Net and have been able to write to text files, event viewers. I was trying to test it with MS SQL 2008 Express and I cannot seem to get it to insert into the DB I have created locally.
Instance: (local)
DB Name: Log4Net
I have omitted the User Id and Password on the connection string in the config below as I am running it locally:
<log4net debug="true">
<!--
APPENDING TO A TEXT FILE
-->
<!--<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="C:\\Log4Net\\TestLog.txt" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" />
</layout>
</appender>-->
<!--
WRITING TO THE EVENT LOG
-->
<!--<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
<applicationName value="Log4Net Test" />
<layout type="log4net.Layout.PatternLayout">
--><!--<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />--><!--
<conversionPattern value="%date - %message%newline" />
</layout>
</appender>-->
<!--
WRITING TO MS SQL
-->
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="100" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=(local);initial catalog=Log4Net;integrated security=false;persist security info=True" />
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (#log_date, #thread, #log_level, #logger, #message, #exception)" />
<parameter>
<parameterName value="#log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="#thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="#log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="#logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="#message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="#exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
<root>
<level value="DEBUG" />
<appender-ref ref="AdoNetAppender" />
</root>
</log4net>
Here is the test C# code:
if (log.IsDebugEnabled)
{
log.Debug("Insert some useful comment..");
}
if (log.IsErrorEnabled)
{
log.Error("Some Error blah blah.. Testing Only..");
}
P.S.
I definitely have created the 'Log' table already.
Link to config examples: http://logging.apache.org/log4net/release/config-examples.html
Thanks in advance
If you want to omit user id and password from the connection string, you need to set integrated security=true.

Encrypt the connectionString used by the log4net AdoNetAppender

I'd like to encrypt the connection string used by the log4net AdoNetAppender.
Can this be done without encrypting the entire appender?
Dion Olsthoorn blogged about setting the connection string in code, but I'd prefer to do it in a config file that is dedicated to logging as it will be using a different database to the rest of the application.
Below is the sample config from http://logging.apache.org/log4net/release/sdk/log4net.Appender.AdoNetAppender.html
<appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=SQLSVR;initial catalog=test_log4net;integrated security=false;persist security info=True;User ID=sa;Password=sa" />
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (#log_date, #thread, #log_level, #logger, #message)" />
<parameter>
<parameterName value="#log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.PatternLayout" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
</parameter>
<parameter>
<parameterName value="#thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout" value="%thread" />
</parameter>
<parameter>
<parameterName value="#log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout" value="%level" />
</parameter>
<parameter>
<parameterName value="#logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout" value="%logger" />
</parameter>
<parameter>
<parameterName value="#message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout" value="%message" />
</parameter>
</appender>
The current source already have the ConnectionStringName property that does exactly what you are looking for.
The ConnectionStringName property was introduced in revision 607748. Version 1.2.10 is revision 395324 which is quite old compared to that.
If you're comfortable working with unreleased code you could get the latest source and compile it yourself. You could probably also get just the updated AdoNetAppender class though it could have dependencies on other updates to the log4net core.
I've been able to work around this by inheriting from the log4net AdoNetAppender and adding a property called ConnectionStringName.
If this is set it will read the connection string from the web.config connection strings and pass it through to the underlying AdoNetAppender.
I'd still be keen for a solution that keeps all the logging configuration in a single file and still allows the connection string to be encrypted.
public class ConfigAdoNetAppender : AdoNetAppender
{
public string ConnectionStringName
{
set
{
this.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings[value].ToString();
}
}
}