WebApi custom log and Azure Storage - azure

I'm using Log4net to log WebApi controllers method call to log method info, execution duration and exceptions in log files (I can change it to Elmah or NLog). I also have some custom message logs which are written by developers. All the log files resides on the same web server and if I want to analyse them, I should move them to the other machine.
Is there any way to write them directly to Azure Storage and which storage type (Blob/Table/File) is the best one?
Thanks

You should probably look into the Azure appender for log4net: http://stemarie.github.io/log4net.Azure/. It works with both blob storage and table storage. I would choose to save to table storage, since you will have some basic search capabilities on top of that, not available on blob storage.
Both ELMAH and NLog have similar features for logging to Azure storage.

For a completely automated solution, you could use Audit.NET with its Audit.WebAPI and Audit.log4net extensions.
Just adding an attribute to your controllers/methods:
[AuditApi]
public class UsersController : ApiController
{ ... }
And a static initialization code:
Audit.Core.Configuration.Setup()
.UseLog4net();
And that's it, you have an auditing system working on your web api calls and logging using your default log4net configuration.

Related

Azure App Service - cannot store logs in azure storage

I would like to configure my diagnostic logs to be redirected to Blob or Table Storage. However the only option I see is Filesystem:
My goal is to collect these logs in splunk
Currently only .NET application logs can be written to the blob storage. Java, PHP, Node.js, Python application logs can only be stored on the file system (without code modifications to write logs to external storage). I'd recommend checking the documentation here
According to this, redirecting to blob storage is only supported for Windows app service plans. Your one appears to be Linux.

Logging stdout/err from a nodejs azure web-app: Blobs still not supported?

nodejs apps on azure can log stdout and stderr to the file system (d:\home\logiles\Application)
The file system logs are automatically disabled after ~ 12 hours
Logging to blog would be a good alternative
According to the docs, it is still not supported for nodejs apps
Just wanted to know if that still holds true. I tried to turn ob blob logging in the portal: app => monitoring => diagnostics logs.
azure correctly creates folders (named after my app) in my blob container, but contain rather empty csv-files only.
Thanks a lot
Yes, the doc is right, Log to blob storage for nodejs is still not supported as of now.
As a workaround, you can take a look at winston-azure-blob-transport.
Hope it helps.

Azure Cloud Service (Classic) - Any way to log Diagnostic.Trace logs to BLOB storage

I've been asked to change an old Azure Cloud Service worker's logging to the System.Diagnostics.Trace logging style of logging. I've done that and now I'm about ready to deploy it to azure.
The client requirement is that these logs should appear in blob storage, similar to how the more modern app service logs can be configured to write their diagnostics to blob storage. There is an expectation that logs can be batched up and uploaded periodically (perhaps time or number of lines based).
Is there a nuget package or other library or config I should enable to connect the application to blob storage? I've spent about 20 mins searching here and online for a solution, but information seems to mainly talk about writing logs to Table Storage..
Edit: More detail:
This is an existing app (C# .Net Framework 4.5) that used to use an external logging service.
I assumed (incorrectly, I think) that the logging to blob storage was something I could configure in the Azure Portal.
As things are right now, NO log file of any kind is generated, but when I run the code in Visual Studio, I can see some Output from the logging statements
I have updated the code to use a standard (custom) logging system
that eventually boils down to using statements like the below:
Trace.TraceInformation($"DEBUG: {message}");
Here are some links I found with related information:
Streaming from command line
Trace listener question
Adding Trace to existing website
Performance Impact of Logging
Smarx Library
The logging is configured by the diagnostics.wadcfgx file which you can see in your solution.
This holds all of the diagnostic information that you want to collect. This can be controlled via the "Properties" of the Web\Worker role (right-click -> Properties).
From there, there is also the option to specify the Storage Account:
This isn't always ideal if you are deploying to multiple environments, so you should be able to alter the configuration from the Azure Portal, by downloading and uploading new configuration, following these instructions.
So logging to blob storage, think of it as uploading existing files to the blob storage. If your current app creates files, then you should use put blob property or blob append to add these files to blob storage. So you must interact with the storage SDK to make these transactions. You could also leverage logic apps which uses connectors to blob storage, and would perform certain actions based on specific triggers(time stamp and other conditions).
If you would like to see the generated logs in Azure Storage, you'll have to enable azure diagnostics but these logs would pertain to the storage account itself, not your app.
Since you mentioned that you see the output, you have to transfer that output as an object ex: (text file), then upload it to the storage account. You can find SDK information for C# here. I hope this helps.

Azure WebApp Not Sending Application Logs to Blob Storage

My team has multiple Azure WebApps (Windows) running Node.js applications. We are using the Winston library to log service activity (e.g., requests). We have configured our Diagnostic Logging in each to store logs in Blob storage resources.
Using the Microsoft Azure Storage Explorer, we can see that there are multiple containers within Blob storage. It seems to be collecting information by the hour, but only 'snapshot' entries as CSV files and .log files with virtually no information. The files are small, which shouldn't be the case because traffic is consistent and we are logging a fair amount.
Our logging works in the filesystem format, but it's clearly not working in blob storage. We cannot seem to find a reason why our logs are not getting stored in our storage accounts.
Is there additional configuration necessary?
According to your description, I checked your issue and found that I could only get the logging via console.log and console.error from the KUDU path D:\home\LogFiles\Application\. Then I found a blog mentioned about application logs for node.js on azure web app as follows:
Setting application logs in the Azure portal
For node.js websites the way to write application logs is by writing to the console using console.log('message') and console.error('message') which goes to Information/Error level log entries. Currently the only supported target for the log files for node.js is the file system.
Other web site types like php and python are not supported for the application logs feature.
Here is a Azure blob storage adapter for popular nodejs logger, e.g. winston: winston-azure-blob-transport, you could leverage it for a workaround to collect the application logs from your node.js website into azure blob storage.

What can I persist logs from NLog that are written to a LocalStorage in an Azure role via Azure Diagnostics?

We are using Azure SDK 2.6 and want to use NLog to write our logs in a Worker Role that we deploy to the Azure Cloud. Our plan is to save these logs to a LocalStorage that we configure for our worker role, and then have the Diagnostics extension persist these logs to a blob storage.
Setting up the LocalStorage account is straight forward enough, but when configuring Diagnostics to point at the directory we want to persist, we have to give an "Absolute path" to the directory which makes little sense in our worker role. I'm wondering how I, according to best practice, can point out my Local Storage directory for persistence with diagnostics?
(I have found a solution online that uses a batch file to create a folder on the hard drive when deploying the worker role and using this folder for storing the logs, but this does not use the LocalStorage, and does not seem to be inline with best practice of how Azure should be used.)

Resources