F# on Azure: using Table Storage for logging

Windows Azure finally has a good F# support. Creating F# Worker Roles is supported right from the wizzard in Visual Studio and you can create a F# Web Role using the F# C# MVC template. I decided to try it out and the first thing I needed to implement was logging. I decided for logging to Azure Table Storage.

I assume you have a basic idea of how Azure Table Storage works. If not, there is a good guide on the Windows Azure website.

The first thing you need to do is to define your log entry class. You need to create a class, Azure Table Storage does not work with F# records. In my case I want to store a timestamp, message and severity.

Alternatively you can make your class inherit from TableEntity that already contains the PartitionKey and RowKey properties. The Severity property is in my case just a simple discriminated union

You can access the Azure API in C# way but you do not need to, there is a great library called Fog by Dan Mohl that makes using Azure API from F# more comfortable.

First you create a Azure Table Storage client using a connection string defined in the Windows Azure Cloud Service Configuration file for a role

Saving a log entry is then very simple thanks to Fog

Saving data to Azure Table Storage may be a slow operation if you do it a lot, so you may want to log asynchronously

As you may have noticed, I use the date as the partiotion key. The thing with Azure Table Storage is, that you can get the data by partition key, row key, or all the data. The log date seems like a reasonable partition key that allows you to get log by days

Update: there is a more way to create the LogEntity using the CLIMuttableAttribte

  • http://twitter.com/Lucifure_com Lucifure_com

    Check out an alternate azure table storage client written in F#.
    http://lucifurestash.codeplex.com/ . Has many more features including array and large data support.

  • https://twitter.com/memark Magnus Markling

    How do you actually use the LogEntity defined in the last Update section of the post? Doesn’t it have to implement ITableEntity?

    • igorkulman

      No it does not, having PartitionKey and RowKey is enough.

      • https://twitter.com/memark Magnus Markling

        Ah, this is because you’re using Fog, right? The ordinary Azure Storage Client requires an ITableEntitiy in all its TableOperations AFAIK.