I use the same logging feature and logging place for all of our workflows and our one and only Construction Kit Eventhandler (more on that another day). It's fairly simple, but functionally enough to keep me going.
So in the terms of C#:
- Make two global variables
public int i = 0;
StringBuilder MyStringBuilder = new StringBuilder();
- Create two functions
public void AddToLog(string msg)
MyStringBuilder.AppendLine(DateTime.Now.ToLongTimeString() + ":" + i.ToString() + "=" + msg);
public void WriteLog()
AddToLog("Log ended at i = " + i.ToString());
SPList SetupList = web2.Lists["Logs"]; //use global SPWeb here or hardcode
SPListItem myItem = SetupList.Items.Add();
myItem["Title"] = myContentType;
myItem["Log"] = MyStringBuilder;
catch (Exception Ex)
//Even logging can fail so you may want to take some action here
- In your code place a code counter and code logging like this:
i = 1;
myUrl = workflowProperties.WebUrl.ToString();
AddToLog(" Url: " + myUrl);
The code counter 'i' gives you the option of pin pointing exactly at which line of code the error occurred.
- At the end of your code execution and at your global error handling code ensure to get the log written:
The Logs list should contain two columns, 'Title' as Single line of text and 'Log' as Multiple lines of text (plain text).
Now you can hardcode your logging destination into the WriteLog function or you can setup a global SPWeb object (remember to dispose it at the end of the code execution) like I do. My code look something like this:
string myUrl = workflowProperties.WebUrl.ToString();
int startcmd = myUrl.IndexOf("//");
int startval = myUrl.IndexOf("/", startcmd + 2);
if (startval == -1) startval = myUrl.Length;
SPSite objSite = new SPSite(myUrl.Substring(0, startval).ToLower().Replace("corporate", "collaboration") + "/SubFolder/Settings");
web2 = objSite.OpenWeb();
The .Replace("corporate", "collaboration") trick is about having two different webs served by the same code, but only having one place to host the logging, e.g. at http://collaboration/SubFolder/Settings/Logs
Obviously our logging code also deals with log archiving, success or failiure logging as well as notification of sys admins, but for the sake of simplicity this is the starting point.