public virtual void Update() { const int ExceptionTitleMaxLength = 64; try { UpdateCore(); } catch (Exception ex) { IndexerLogEntry logEntry = new IndexerLogEntry() { Title = ex.Message, Date = DateTime.UtcNow, ExceptionDetails = ex.ToString() }; if (logEntry.Title.Length > ExceptionTitleMaxLength) { logEntry.Title = logEntry.Title.Substring(0, ExceptionTitleMaxLength); } // Remove any new lines from the metadata, otherwise you get a 403 // back from the Azure SDK logEntry.Title = logEntry.Title.Replace("\r", string.Empty); logEntry.Title = logEntry.Title.Replace("\n", string.Empty); _logWriter.Write(logEntry); } }
public IResultSegment <IndexerLogEntry> ReadWithoutDetails(int maximumResults, string continuationToken) { BlobContinuationToken blobContinuationToken = BlobContinuationTokenSerializer.Deserialize(continuationToken); BlobResultSegment blobSegment; try { blobSegment = _logsContainer.ListBlobsSegmented( prefix: _containerDirectory, useFlatBlobListing: true, blobListingDetails: BlobListingDetails.Metadata, maxResults: maximumResults, currentToken: blobContinuationToken, options: null, operationContext: null); } catch (StorageException exception) { if (exception.IsNotFound()) { return(null); } else { throw; } } if (blobSegment == null) { return(null); } List <IndexerLogEntry> results = new List <IndexerLogEntry>(); // Cast from IListBlobItem to ICloudBlob is safe due to useFlatBlobListing: true above. foreach (ICloudBlob blob in blobSegment.Results) { IndexerLogEntry entry = ParseEntryFromBlobMetadata(blob); if (entry != null) { results.Add(entry); } } string nextContinuationToken = BlobContinuationTokenSerializer.Serialize(blobSegment.ContinuationToken); return(new ResultSegment <IndexerLogEntry>(results, nextContinuationToken)); }
public void Write(IndexerLogEntry entry) { if (entry == null) { return; } string logBlobName = BlobNames.GetConflictFreeDateTimeBasedBlobName(entry.Date); entry.Id = logBlobName; string logEntryAsJson = JsonConvert.SerializeObject(entry, JsonSerialization.Settings); _logsContainer.CreateIfNotExists(); CloudBlockBlob logBlob = _logsContainer.GetBlockBlobReference(_containerDirectory + "/" + logBlobName); logBlob.Metadata[BlobLogEntryKeys.TitleKey] = entry.Title; logBlob.Metadata[BlobLogEntryKeys.LogDate] = entry.Date.ToString(CultureInfo.InvariantCulture); logBlob.UploadText(logEntryAsJson); }
/// <summary> /// Creates a log entry without details by only using information /// available on the blob itself, without looking at the content /// </summary> /// <param name="blob">The blob to parse</param> /// <returns>A log entry or null</returns> private IndexerLogEntry ParseEntryFromBlobMetadata(ICloudBlob blob) { if (blob == null || !blob.Metadata.ContainsKey(BlobLogEntryKeys.LogDate) || !blob.Metadata.ContainsKey(BlobLogEntryKeys.TitleKey)) { return(null); } IndexerLogEntry entry = new IndexerLogEntry(); entry.Id = blob.Name; if (_containerDirectory.Length != 0 && _containerDirectory.Length < entry.Id.Length) { entry.Id = entry.Id.Substring(_containerDirectory.Length + 1); } entry.Date = DateTime.Parse(blob.Metadata[BlobLogEntryKeys.LogDate]); entry.Title = blob.Metadata[BlobLogEntryKeys.TitleKey]; return(entry); }
/// <summary> /// Creates a log entry without details by only using information /// available on the blob itself, without looking at the content /// </summary> /// <param name="blob">The blob to parse</param> /// <returns>A log entry or null</returns> private IndexerLogEntry ParseEntryFromBlobMetadata(ICloudBlob blob) { if (blob == null || !blob.Metadata.ContainsKey(BlobLogEntryKeys.LogDate) || !blob.Metadata.ContainsKey(BlobLogEntryKeys.TitleKey)) { return null; } IndexerLogEntry entry = new IndexerLogEntry(); entry.Id = blob.Name; if (_containerDirectory.Length != 0 && _containerDirectory.Length < entry.Id.Length) { entry.Id = entry.Id.Substring(_containerDirectory.Length + 1); } entry.Date = DateTime.Parse(blob.Metadata[BlobLogEntryKeys.LogDate], CultureInfo.InvariantCulture); entry.Title = blob.Metadata[BlobLogEntryKeys.TitleKey]; return entry; }