Change log4net logging level programmatically


Hi,

We had one requirement in which we wanted to change the logging level of log4net programmatically based on the value passed.

Suppose this is how we have configured log4net in our application.


<?xml version="1.0"?>
<configuration>
 <configSections>
 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
 </configSections>
 <log4net>
 <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
 <file value="TestLog.txt"/>
 <appendToFile value="true"/>
 <rollingStyle value="Composite"/>
 <datePattern value="yyyyMMdd"/>
 <maxSizeRollBackups value="10"/>
 <maximumFileSize value="10MB"/>
 <layout type="log4net.Layout.PatternLayout">
 <conversionPattern value="[%d{yyyy-MM-dd HH:mm:ss}] [%p] [%c:%L] - %m%n"/>
 </layout>
 </appender>
 <root>
 <level value="DEBUG"/>
 <appender-ref ref="RollingLogFileAppender"/>
 </root>
 </log4net>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

The sample code for changing the log level


namespace SampleLogApp
{
 using System.Reflection;

using log4net;
 using log4net.Core;
 using log4net.Repository;
 using log4net.Repository.Hierarchy;
 using log4net.Config;

public partial class Form1 : Form
 {

 private static readonly ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 private List<Person> lstPerson;

 public Form1()
 {
 InitializeComponent();
 // configure the log4net logging
 XmlConfigurator.Configure();
 }

private void btnStartLogging_Click(object sender, EventArgs e)
 {
 foreach(Person person in lstPerson)
 {
 // set the logging type depending on person
 SetLoggingLevel(person.LogType);
 logger.Debug("Debug: " + person.FullName);
 logger.Info("Info: " + person.FullName);
 logger.Warn("Warn: " + person.FullName);
 logger.Error("Error: " + person.FullName);
 }
 }

private void Form1_Load(object sender, EventArgs e)
 {
 lstPerson = new List<Person>();
 lstPerson.Add(new Person() { FullName = "Abhinav Ranjan", LogType = "Debug" });
 lstPerson.Add(new Person() { FullName = "Nirav Pancholi", LogType = "Info" });
 lstPerson.Add(new Person() { FullName = "Shobhit Bhatnagar", LogType = "Error" });
 }

/// <summary>
 /// Sets the logging level.
 /// </summary>
 /// <param name="logType">Type of the log.</param>
 private static void SetLoggingLevel(string logType)
 {
 Logger currentLogger = (Logger)logger.Logger;
 currentLogger.Level = currentLogger.Hierarchy.LevelMap[logType];
 }
 }
}

The output in TestLog.txt

[2012-04-16 00:17:27] [DEBUG] [SampleLogApp.Form1:39] – Debug: Abhinav Ranjan
[2012-04-16 00:17:27] [INFO] [SampleLogApp.Form1:40] – Info: Abhinav Ranjan
[2012-04-16 00:17:27] [WARN] [SampleLogApp.Form1:41] – Warn: Abhinav Ranjan
[2012-04-16 00:17:27] [ERROR] [SampleLogApp.Form1:42] – Error: Abhinav Ranjan
[2012-04-16 00:17:27] [INFO] [SampleLogApp.Form1:40] – Info: Nirav Pancholi
[2012-04-16 00:17:27] [WARN] [SampleLogApp.Form1:41] – Warn: Nirav Pancholi
[2012-04-16 00:17:27] [ERROR] [SampleLogApp.Form1:42] – Error: Nirav Pancholi
[2012-04-16 00:17:27] [ERROR] [SampleLogApp.Form1:42] – Error: Shobhit Bhatnagar

The helpful post

http://geekswithblogs.net/rakker/archive/2007/08/22/114900.aspx

Hope it helps.

Using EncryptedXml class for encrypting XML file in C#


Hi,

We had a requirement to encrypt a particular node and its corresponding child elements in one of our xml file. While searching for the best and the simplest way to do so, I came across these wonderful posts which make use of EncrptedXml class.

http://www.devx.com/dotnet/Article/21564/1954

http://dotnetslackers.com/articles/xml/XMLEncryption.aspx

http://blogs.msdn.com/b/shawnfa/archive/2003/11/14/57032.aspx

Hope it helps

Refresh ObservableCollection in WPF


ObservableCollection only provided notifications when we make any change in the collection itself like Adding or Removing an Item.

If we update any properties of a contained class, it doesn’t raise any notifications.

For e.g.

If I have an ObservableCollection of Person object and it is bind to a TreeView. If I add or remove person object from the ObservableCollection I will be able to see the changes in my TreeView also.

Here Person object has only one string property FullName

Now if I click on Change Name button, which simply renames the selected Person, I will not be able to see the change in my TreeView.

Here in this case we need to call the Refresh method of CollectionViewSource.


CollectionViewSource.GetDefaultView(this.observableCollPerson).Refresh();

https://skydrive.live.com/redir.aspx?cid=2312e1103cbe5ecd&resid=2312E1103CBE5ECD!339&parid=root

Have a look at this solution as well

http://blog.falafel.com/blogs/11-01-30/Using_CollectionViewSource_without_Refresh_for_Faster_Filtering_in_Silverlight

Hope it helps.

Advertisements

Adding a Close Context Menu to TabItem in WPF


Continuing the previous post

https://nishantrana.wordpress.com/2012/04/08/creating-dynamic-tabitem-in-wpf/

let us add the Close Context menu to our TabItem.

To do this we need to add the Context Menu tag to the DataTemplate defined for the Tab.

</pre>
<TabControl Height="271" HorizontalAlignment="Left" Margin="123,9,0,0" Name="mainTabControl" VerticalAlignment="Top" Width="441"
 IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding ObservableCollectionTabItems}" Background="White">
 <TabControl.ItemTemplate>
 <DataTemplate>
 <TextBlock Text="{Binding Header}" >
 <TextBlock.ContextMenu>
 <ContextMenu>
 <MenuItem Header="Close" Click="MenuItem_Click">
 </MenuItem>
 </ContextMenu>
 </TextBlock.ContextMenu>
 </TextBlock>
 </DataTemplate>
 </TabControl.ItemTemplate>
 </TabControl>
<pre>

Add the following code to the ViewModel class for the MainWindow.


public void CloseTabItem(Object sender)
 {
 VMParentForViews vmParentForViews = (sender as MenuItem).DataContext as VMParentForViews;
 this.ObservableCollectionTabItems.Remove(vmParentForViews);
 }

Call the above method from the code behind of the MainWindow’s MenuItem_Click event

This is how the Close menu looks like, clicking on it closes the tab item. (i.e. removes it from the ObservableCollection to which tab control is bind)

The sample application link

https://skydrive.live.com/redir.aspx?cid=2312e1103cbe5ecd&resid=2312E1103CBE5ECD!338&parid=root

Hope it helps

Creating dynamic TabItem in WPF.


Hi,

We recently had a requirement in our project to create dynamic TabItems

something similar to below screen shot.

Here every time when we click on Add View One and Add View Two buttons a new TabItem gets added to the tab control on the right side showing its respective views.

The project structure is like this

Two views, ViewTypeOne and ViewTypeTwo with a simple textblock in them.

Two ViewModel for those views, one for the main window and the fourth one VMParentForView which is the parent of our other two view models.

VMParentForView class

The TabControl in the main window is bind to the ObservableCollection of VMParentForViews viewmodel and the Textblock to the Header property of Views.


<TabControl Height=”271″ HorizontalAlignment=”Left” Margin=”123,9,0,0″ Name=”mainTabControl” VerticalAlignment=”Top” Width=”441″ 
IsSynchronizedWithCurrentItem=”True” ItemsSource=”{Binding ObservableCollectionTabItems}” Background=”White”>

<TabControl.ItemTemplate>

<DataTemplate>

<TextBlock Text=”{Binding Header}” ></TextBlock>

</DataTemplate>

</TabControl.ItemTemplate>

</TabControl>

Here is the sample code of the demo application.

https://skydrive.live.com/redir.aspx?cid=2312e1103cbe5ecd&resid=2312E1103CBE5ECD!337&parid=root

Hope it helps.

How to – Create dynamic ContextMenu for TreeView in WPF


Hi,

Sharing a simple example wherein we are generating dynamic menuitems for the context menu based on the node or treeviewitem selected in the treeview.

If root Packages is selected –

If Package is selected –

If Batch is selected –

The xml file

<br />
&lt;?xml version="1.0" encoding="utf-8" ?&gt;<br />
&lt;Packages&gt;<br />
 &lt;Package Name="Package 1" Type="Package"&gt;<br />
 &lt;Batch Name="Batch 1" Type="Batch"/&gt;<br />
 &lt;Batch Name="Batch 2" Type="Batch"/&gt;<br />
 &lt;/Package&gt;<br />
 &lt;Package Name="Package 2" Type="Package"&gt;<br />
 &lt;Batch Name="Batch 1" Type="Batch"/&gt;<br />
 &lt;Batch Name="Batch 2" Type="Batch"/&gt;<br />
 &lt;/Package&gt;<br />
&lt;/Packages&gt;<br />

XAML

<br />
&lt;Window x:Class="SampleSyncServerAdminTool.MainWindow"<br />
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"<br />
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"<br />
 Title="MainWindow" Height="350" Width="525"&gt;<br />
 &lt;Window.Resources&gt;<br />
 &lt;!--Binding TreeView--&gt;<br />
 &lt;XmlDataProvider x:Key="MyList" Source="Packages.xml" XPath="Packages"/&gt;</p>
<p>&lt;HierarchicalDataTemplate DataType="Packages" ItemsSource="{Binding XPath=*}"&gt;<br />
 &lt;TextBlock Text="Packages"&gt;&lt;/TextBlock&gt;<br />
 &lt;/HierarchicalDataTemplate&gt;</p>
<p>&lt;HierarchicalDataTemplate DataType="Package" ItemsSource="{Binding XPath=*}"&gt;<br />
 &lt;TextBlock Text="{Binding XPath=@Name}"&gt;&lt;/TextBlock&gt;<br />
 &lt;/HierarchicalDataTemplate&gt;</p>
<p>&lt;HierarchicalDataTemplate DataType="Batch" ItemsSource="{Binding XPath=*}"&gt;<br />
 &lt;TextBlock Text="{Binding XPath=@Name}"&gt;&lt;/TextBlock&gt;<br />
 &lt;/HierarchicalDataTemplate&gt;</p>
<p>&lt;!-- Resources for Right Hand Side detail grid--&gt;</p>
<p>&lt;DataTemplate x:Key="ClosableTabItemTemplate"&gt;<br />
 &lt;DockPanel Width="120"&gt;<br />
 &lt;Button<br />
 Command="{Binding Path=CloseCommand}"<br />
 Content="X"<br />
 Cursor="Hand"<br />
 DockPanel.Dock="Right"<br />
 Focusable="False"<br />
 FontFamily="Courier"<br />
 FontSize="9"<br />
 FontWeight="Bold"<br />
 Margin="0,1,0,0"<br />
 Padding="0"<br />
 VerticalContentAlignment="Bottom"<br />
 Width="16" Height="16"<br />
 /&gt;<br />
 &lt;ContentPresenter<br />
 Content="{Binding Path=DisplayName}"<br />
 VerticalAlignment="Center"<br />
 /&gt;<br />
 &lt;/DockPanel&gt;<br />
 &lt;/DataTemplate&gt;</p>
<p>&lt;DataTemplate x:Key="WorkspacesTemplate"&gt;<br />
 &lt;TabControl<br />
 IsSynchronizedWithCurrentItem="True"<br />
 ItemsSource="{Binding}"<br />
 ItemTemplate="{StaticResource ClosableTabItemTemplate}"<br />
 Margin="4"<br />
 /&gt;<br />
 &lt;/DataTemplate&gt;</p>
<p>&lt;/Window.Resources&gt;<br />
 &lt;Grid&gt;<br />
 &lt;DockPanel&gt;<br />
 &lt;TreeView DockPanel.Dock="Left" Width="150" Name="treeViewPackages"</p>
<p> ItemsSource="{Binding Source={StaticResource MyList}}"&gt;<br />
 &lt;TreeView.Resources&gt;<br />
 &lt;ContextMenu x:Key="TestMenu"&gt;<br />
 &lt;/ContextMenu&gt;<br />
 &lt;/TreeView.Resources&gt;<br />
 &lt;TreeView.ItemContainerStyle&gt;<br />
 &lt;Style TargetType="{x:Type TreeViewItem}"&gt;<br />
 &lt;Setter Property="IsExpanded" Value="True"/&gt;<br />
 &lt;EventSetter Event="PreviewMouseRightButtonDown"<br />
 Handler="OnPreviewMouseRightButtonDown" /&gt;<br />
 &lt;/Style&gt; &lt;/TreeView.ItemContainerStyle&gt;<br />
 &lt;/TreeView&gt;<br />
 &lt;Grid DockPanel.Dock="Right"&gt;<br />
 &lt;HeaderedContentControl<br />
 Content="{Binding Path=Workspaces}"<br />
 ContentTemplate="{StaticResource WorkspacesTemplate}"<br />
 Header="Workspaces"<br />
 /&gt;<br />
 &lt;/Grid&gt;<br />
 &lt;/DockPanel&gt;<br />
 &lt;/Grid&gt;<br />
&lt;/Window&gt;<br />

XAML.cs

<br />
using System;<br />
using System.Collections.Generic;<br />
using System.Linq;<br />
using System.Text;<br />
using System.Windows;<br />
using System.Windows.Controls;<br />
using System.Windows.Data;<br />
using System.Windows.Documents;<br />
using System.Windows.Input;<br />
using System.Windows.Media;<br />
using System.Windows.Media.Imaging;<br />
using System.Windows.Navigation;<br />
using System.Windows.Shapes;<br />
using System.Xml;</p>
<p>namespace SampleSyncServerAdminTool<br />
{<br />
 /// &lt;summary&gt;<br />
 /// Interaction logic for MainWindow.xaml<br />
 /// &lt;/summary&gt;<br />
 public partial class MainWindow : Window<br />
 {<br />
 public MainWindow()<br />
 {<br />
 InitializeComponent();<br />
 }</p>
<p>void OnPreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)<br />
 {</p>
<p>DependencyObject obj = e.OriginalSource as DependencyObject;<br />
 TreeViewItem item = GetDependencyObjectFromVisualTree(obj, typeof(TreeViewItem)) as TreeViewItem;<br />
 XmlElement selectedElement = (XmlElement)item.Header;</p>
<p>string header = selectedElement.Name;<br />
 if (header.ToUpper() == "PACKAGES")<br />
 {<br />
 // Packages root node<br />
 MenuItem mnuItem = new MenuItem();<br />
 mnuItem.Header = "New Package";<br />
 ContextMenu menu = new ContextMenu() { };<br />
 menu.Items.Add(mnuItem);<br />
 (sender as TreeViewItem).ContextMenu = menu;<br />
 }</p>
<p>else<br />
 {<br />
 string attName = selectedElement.Attributes["Name"].Value;<br />
 string type = selectedElement.Attributes["Type"].Value;</p>
<p>string fullNodeInfo = "Header: " + header + " Attribute Name: " + attName + " Type: " + type;</p>
<p>if (type.ToUpper() == "PACKAGE")<br />
 {<br />
 MenuItem mnuItem1 = new MenuItem();<br />
 mnuItem1.Header = "New Package";<br />
 MenuItem mnuItem2 = new MenuItem();<br />
 mnuItem2.Header = "Show Package Details";<br />
 MenuItem mnuItem3 = new MenuItem();<br />
 mnuItem3.Header = "Edit Package";<br />
 MenuItem mnuItem4 = new MenuItem();<br />
 mnuItem4.Header = "Delete Package";<br />
 MenuItem mnuItem5 = new MenuItem();<br />
 mnuItem5.Header = "Add to Queue";</p>
<p>ContextMenu menu = new ContextMenu() { };<br />
 menu.Items.Add(mnuItem1);<br />
 menu.Items.Add(mnuItem2);<br />
 menu.Items.Add(mnuItem3);<br />
 menu.Items.Add(mnuItem4);<br />
 menu.Items.Add(mnuItem5);</p>
<p>(sender as TreeViewItem).ContextMenu = menu;<br />
 }<br />
 else if (type.ToUpper() == "BATCH")<br />
 {<br />
 MenuItem mnuItem1 = new MenuItem();<br />
 mnuItem1.Header = "Show Batch Details";<br />
 MenuItem mnuItem2 = new MenuItem();<br />
 mnuItem2.Header = "Edit Batch";<br />
 MenuItem mnuItem3 = new MenuItem();<br />
 mnuItem3.Header = "Delete Batch";</p>
<p>ContextMenu menu = new ContextMenu() { };<br />
 menu.Items.Add(mnuItem1);<br />
 menu.Items.Add(mnuItem2);<br />
 menu.Items.Add(mnuItem3);</p>
<p>(sender as TreeViewItem).ContextMenu = menu;<br />
 }<br />
 }<br />
 }</p>
<p>private static DependencyObject GetDependencyObjectFromVisualTree(DependencyObject startObject, Type type)<br />
 {<br />
 var parent = startObject;<br />
 while (parent != null)<br />
 {<br />
 if (type.IsInstanceOfType(parent))<br />
 break;<br />
 parent = VisualTreeHelper.GetParent(parent);<br />
 }<br />
 return parent;<br />
 }<br />
 }<br />
}<br />

Bye.

Advertisements

Nishant Rana's Weblog

Everything related to Microsoft .NET Technology

Skip to content ↓