logging/api/LoggingSample/Program.cs (189 lines of code) (raw):

/* * Copyright (c) 2016 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ // [START complete] using Google.Api; using Google.Api.Gax.Grpc; using Google.Api.Gax.ResourceNames; using Google.Cloud.Logging.Type; using Google.Cloud.Logging.V2; using Google.Protobuf.WellKnownTypes; using Grpc.Core; using System; using System.Collections.Generic; using System.Linq; namespace GoogleCloudSamples { public class LoggingSample { private static readonly string s_projectId = "YOUR-PROJECT-ID"; private static readonly string s_usage = "Usage: \n" + " dotnet run create-log-entry log-id\n" + " dotnet run list-log-entries log-id\n" + " dotnet run create-sink sink-id log-id\n" + " dotnet run list-sinks\n" + " dotnet run update-sink sink-id log-id\n" + " dotnet run delete-log log-id\n" + " dotnet run delete-sink sink-id \n"; private readonly CallSettings _retryAWhile = CallSettings.FromRetry( RetrySettings.FromExponentialBackoff( maxAttempts: 15, initialBackoff: TimeSpan.FromSeconds(3), maxBackoff: TimeSpan.FromSeconds(12), backoffMultiplier: 2.0, retryFilter: RetrySettings.FilterForStatusCodes(StatusCode.Internal, StatusCode.DeadlineExceeded))); public bool PrintUsage() { Console.WriteLine(s_usage); return true; } public static int Main(string[] args) { if (s_projectId == "YOUR-PROJECT" + "-ID") { Console.WriteLine("Update Program.cs and replace YOUR-PROJECT" + "-ID with your project id, and recompile."); return -1; } LoggingSample loggingSample = new LoggingSample(); return loggingSample.Run(args); } // [START logging_write_log_entry] private void WriteLogEntry(string logId) { var client = LoggingServiceV2Client.Create(); LogName logName = new LogName(s_projectId, logId); var jsonPayload = new Struct() { Fields = { { "name", Value.ForString("King Arthur") }, { "quest", Value.ForString("Find the Holy Grail") }, { "favorite_color", Value.ForString("Blue") } } }; LogEntry logEntry = new LogEntry { LogNameAsLogName = logName, Severity = LogSeverity.Info, JsonPayload = jsonPayload }; MonitoredResource resource = new MonitoredResource { Type = "global" }; IDictionary<string, string> entryLabels = new Dictionary<string, string> { { "size", "large" }, { "color", "blue" } }; client.WriteLogEntries(logName, resource, entryLabels, new[] { logEntry }, _retryAWhile); Console.WriteLine($"Created log entry in log-id: {logId}."); } // [END logging_write_log_entry] // [START logging_list_log_entries] private void ListLogEntries(string logId) { var client = LoggingServiceV2Client.Create(); LogName logName = new LogName(s_projectId, logId); ProjectName projectName = new ProjectName(s_projectId); var results = client.ListLogEntries(Enumerable.Repeat(projectName, 1), $"logName={logName.ToString()}", "timestamp desc", callSettings: _retryAWhile); foreach (var row in results) { Console.WriteLine($"{row.TextPayload.Trim()}"); } } // [END logging_list_log_entries] // [START logging_create_sink] private void CreateSink(string sinkId, string logId) { var sinkClient = ConfigServiceV2Client.Create(); LogSink myLogSink = new LogSink(); myLogSink.Name = sinkId; // This creates a sink using a Google Cloud Storage bucket // named the same as the projectId. // This requires editing the bucket's permissions to add the Entity Group // named 'cloud-logs@google.com' with 'Owner' access for the bucket. // If this is being run with a Google Cloud service account, // that account will need to be granted 'Owner' access to the Project. // In Powershell, use this command: // PS > Add-GcsBucketAcl <your-bucket-name> -Role OWNER -Group cloud-logs@google.com myLogSink.Destination = "storage.googleapis.com/" + s_projectId; LogName logName = new LogName(s_projectId, logId); myLogSink.Filter = $"logName={logName.ToString()}AND severity<=ERROR"; ProjectName projectName = new ProjectName(s_projectId); sinkClient.CreateSink(projectName, myLogSink, _retryAWhile); Console.WriteLine($"Created sink: {sinkId}."); } // [END logging_create_sink] // [START logging_list_sinks] private void ListSinks() { var sinkClient = ConfigServiceV2Client.Create(); ProjectName projectName = new ProjectName(s_projectId); var listOfSinks = sinkClient.ListSinks(projectName, callSettings: _retryAWhile); foreach (var sink in listOfSinks) { Console.WriteLine($"{sink.Name} {sink.ToString()}"); } } // [END logging_list_sinks] // [START logging_update_sink] private void UpdateSinkLog(string sinkId, string logId) { var sinkClient = ConfigServiceV2Client.Create(); LogName logName = new LogName(s_projectId, logId); LogSinkName sinkName = new LogSinkName(s_projectId, sinkId); var sink = sinkClient.GetSink(sinkName, _retryAWhile); sink.Filter = $"logName={logName.ToString()}AND severity<=ERROR"; sinkClient.UpdateSink(sinkName, sink, _retryAWhile); Console.WriteLine($"Updated {sinkId} to export logs from {logId}."); } // [END logging_update_sink] // [START logging_delete_log] private void DeleteLog(string logId) { var client = LoggingServiceV2Client.Create(); LogName logName = new LogName(s_projectId, logId); client.DeleteLog(logName, _retryAWhile); Console.WriteLine($"Deleted {logId}."); } // [END logging_delete_log] // [START logging_delete_sink] private void DeleteSink(string sinkId) { var sinkClient = ConfigServiceV2Client.Create(); LogSinkName sinkName = new LogSinkName(s_projectId, sinkId); sinkClient.DeleteSink(sinkName, _retryAWhile); Console.WriteLine($"Deleted {sinkId}."); } // [END logging_delete_sink] public int Run(string[] args) { if (s_projectId == "YOUR-PROJECT" + "-ID") { Console.WriteLine("Update Program.cs and replace YOUR-PROJECT" + "-ID with your project id, and recompile."); return -1; } if (args.Length < 1 && PrintUsage()) return -1; try { switch (args[0].ToLower()) { case "create-log-entry": if (args.Length < 2 && PrintUsage()) return -1; WriteLogEntry(args[1]); break; case "list-log-entries": if (args.Length < 2 && PrintUsage()) return -1; ListLogEntries(args[1]); break; case "create-sink": if (args.Length < 3 && PrintUsage()) return -1; CreateSink(args[1], args[2]); break; case "list-sinks": ListSinks(); break; case "update-sink": if (args.Length < 3 && PrintUsage()) return -1; UpdateSinkLog(args[1], args[2]); break; case "delete-log": if (args.Length < 2 && PrintUsage()) return -1; DeleteLog(args[1]); break; case "delete-sink": if (args.Length < 2 && PrintUsage()) return -1; DeleteSink(args[1]); break; default: PrintUsage(); return -1; } return 0; } catch (Google.GoogleApiException e) { Console.WriteLine(e.Message); return e.Error.Code; } } } } // [END complete]