Windows Insider

Why Read When You Can Parse?

Microsoft's Log Parser might be the one of the most flexible tools you never knew about.

My wife is always quick to reprimand me when I bring home geek speak. She'll say, "You don't interface with people, you talk to them!" Or, "You're not parsing your mail, you're reading your mail!"

But truth be told, there really is a difference between reading your mail and parsing it. I mean, do you really read through the 18 credit-card solicitations you get every day? Probably not. You instead parse them to find just the mail that's truly important to you.

In the Windows world, Microsoft's often-overlooked Log Parser tool does the same thing. Initially built to handle searching IIS logs, Log Parser's current version is capable of querying and converting over 20 different log file formats into 13 different textual and graphical outputs. It uses a dialect of SQL to provide rich search, aggregation and sorting capabilities limited only by the scripting ability of the user. Though some predefined log formats like Windows Event, IIS and NetMon logs are available by default, virtually any well-formed data structure in a text file can be manipulated using this command-line tool.

To use Log Parser, download it from the Microsoft Web site here. After installation, check out the command logparser -h to learn more about the syntax and file formats supported.

Figure 1
[Click on image for larger view.]
Figure 1. Using -queryinfo exposes the fields Log Parser can query against.

Parse Like a Pro
Let's look at a couple of examples of how Log Parser can enhance your vision into your systems' log files. One very simple query is to check the last 100 entries of your Windows System Event Log to see if any NETLOGON errors have appeared. If you find any, report the error message to the screen:

LogParser.exe "SELECT TOP 100 message FROM system WHERE sourcename = 'NETLOGON'"

As you can see above, using Log Parser most effectively means knowing a little about SQL querying.

Reporting information to the screen is only so useful, because it can scroll by you far too fast to read. If you want to store the results in a text file called results.txt, you make the following change to your select statement:

LogParser.exe "SELECT TOP 100 message INTO results.txt FROM system WHERE sourcename = 'NETLOGON'"

Whether it's the event log or any other input stream you're pulling information from, you can always add the -queryinfo switch to return information about what fields can be queried against. Interested in the fields available for the Security Event Log? Use this syntax:

LogParser.exe "SELECT * FROM security" -queryinfo

You'll get back the list of the fields that can be queried from the Security Event Log, as well as each field's associated data type including integer, string, time, and so on.

We all know it's a good practice to enable security logging, but getting useful data from that security log can sometimes be almost impossible. If we want to find out if the user "bgates" has been attempting to read files for which he has no access, we can use the -resolveSIDs switch to resolve user SID information and query against his username:

LogParser.exe "SELECT * INTO results.txt FROM security WHERE sid LIKE '%bgates%'" -resolveSIDs:ON

Another useful query involves aggregating folder sizes for a list of folders. Interested in finding out the top 10 consumers of disk space on your company's home drives? The syntax below assumes that home folders are rooted at H:\home with the user's name as the subfolder name:

LogParser.exe "SELECT TOP 10 folder path, sum(size) USING EXTRACT_PREFIX(EXTRACT_PATH (path), 2, '\\') AS folderpath FROM H:\home\* GROUP BY folderpath ORDER BY sum(size) DESC" -i:fs

As you can see, this sort of request involves a bit more SQL experience to sum all the subfolders of each user's first level folder. It uses the extract_prefix function to grab the folder name of each folder below H:\home and sum the contents. The top 10 folders by size are returned to the command window.

Log Parser can handle chart creation as well. If you've installed the Microsoft Office Web Components to the machine where Log Parser is running, you can format the results of this or any numerically valued query to a chart graphic. Though the Microsoft Office Web Components are not a part of Office 2007, they're still available for Office 2003 and can be downloaded from Microsoft's Web site.

To change the output format of your folder size query in order to create a chart, change the syntax to include the -o:chart switch and a pointer to the chart's filename, FolderChart.gif:

LogParser.exe "SELECT TOP 10 folder path, sum(size) USING EXTRACT_PREFIX(EXTRACT_PATH (path), 2, '\\') AS folderpath INTO Folder Chart.gif FROM H:\home\* GROUP BY folderpath ORDER BY sum(size) DESC" -i:fs -o:chart

Log Parser's real strength lies in its extensibility. Not limited to just preconfigured Windows logs, Log Parser can search and aggregate data in any comma- or tab-delineated file with a header row. This means that any vendor's log file format can potentially be parsed. Check out the .TSV file shown here:

Month User Sales
Jan   Dan  100
Jan   Mark 235
Jan   Mark 210
Feb   Dan  50
Feb   Dan  520
Feb   Joe  445
Mar   Mark 320
Mar   Lee  420
Mar   Dan  110
Apr   Lee  120
Apr   Lee  60
Apr   Mark 510

Using this syntax we can use the SQL query capabilities of Log Parser to find out Dan's sales for each month:

LogParser.exe "SELECT month, user, sales FROM sales.tsv WHERE user = 'Dan'"

A Question of Support
Having been built as a "skunk works" project by one of Microsoft's developers, all of this nifty functionality comes with virtually no Microsoft support. At least that's the word from the tool's unofficial Web site at www.logparser.com. This Web site sports a few useful parsing recipes in its repository and a lightly attended forum for questions. There's even a book available, written by the tool's creator, which details even more creative solutions one can build using the Log Parser tool.

In any case, if you've got an interesting problem you've solved using Log Parser, let me know. The boundaries of this extensible tool are limited only by your imagination.

About the Author

Greg Shields is Author Evangelist with PluralSight, and is a globally-recognized expert on systems management, virtualization, and cloud technologies. A multiple-year recipient of the Microsoft MVP, VMware vExpert, and Citrix CTP awards, Greg is a contributing editor for Redmond Magazine and Virtualization Review Magazine, and is a frequent speaker at IT conferences worldwide. Reach him on Twitter at @concentratedgreg.

Featured

comments powered by Disqus

Subscribe on YouTube