cloudwatchlogger 0.2.1 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: fb1e357bd158f76606d1e13a03ed520f6dead066
4
- data.tar.gz: 4dd0d17ac08f99ff207519b1b9e5ad7c0120cc8d
2
+ SHA256:
3
+ metadata.gz: 132c7aab13981c643838904bd543fd3dadf18e35a46df7aa3cfba528e5732a7a
4
+ data.tar.gz: 7f64be893d988a05eb5bf4b607261a95f4ff623fe73d13f09e573950b1cf9e9c
5
5
  SHA512:
6
- metadata.gz: 9ae37a40c94f7f2b7b82702ff319d3511dc0baf64e70e095b2bfd2cfaf37bb06955dd083426cb068412f1dcdfc560b65ef586c4d50243ea902792162eb11ec59
7
- data.tar.gz: e0c060b9ec7d9001a450b0da9d611e7d1bd1c77cf70278e32f38c646c64effe4dd7bdb997dfec03dfbc1603d878f20b642b243fefe177d9e37e5a85081f1dc67
6
+ metadata.gz: 1a81c48830dec6cfdb4ab851121f3cce19e2859d9549ac853338575f6e15cdadc1c03d5fa3beda5e04e68f76afdcb5ff3f00efb9ef1a0f65e3a454ec9992b841
7
+ data.tar.gz: cb7283ed4226ad1deda01e16a4c1578297f6f416f8dc827a76cf8edbaf8e79e389e3af9d32067cd5ed1593f0f0374b70f9e7826fd25863ed12a017bc402f0dff
data/README.md CHANGED
@@ -20,7 +20,7 @@ log = CloudWatchLogger.new({access_key_id: 'YOUR_ACCESS_KEY_ID', secret_access_k
20
20
  log.info("Hello World from Ruby")
21
21
  ```
22
22
 
23
- In case you need to pass different region or group's different Log Stream name:
23
+ The region will default to the value of the environment variable `AWS_REGION`. In case you need to pass different region or group's different Log Stream name:
24
24
 
25
25
  ```ruby
26
26
  log = CloudWatchLogger.new({
@@ -29,6 +29,12 @@ log = CloudWatchLogger.new({
29
29
  }, 'YOUR_CLOUDWATCH_LOG_GROUP', 'YOUR_CLOUDWATCH_LOG_STREAM', region: 'YOUR_CLOUDWATCH_REGION' )
30
30
  ```
31
31
 
32
+ Provding an empty hash instead of credentials will cause the AWS SDK to search the default credential provider chain for credentials, namely:
33
+
34
+ 1. Environment variables `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`
35
+ 1. Amazon ECS container credentials (task role)
36
+ 1. Instance profile credentials (IAM role)
37
+
32
38
  ### With Rails
33
39
 
34
40
  config/environments/production.rb
@@ -80,6 +86,18 @@ Will produce the following log message in CloudWatch Logs:
80
86
  "<Date> severity=WARN, boom=box, bar=soap"
81
87
  ```
82
88
 
89
+ ### Custom Log Formatters
90
+ The default formatter in this gem ensures that the timestamp sent to cloudwatch will reflect the time the message was pushed onto the queue. If you want to use a custom log formatter, in order for you to not have a disparity between your actual log time and the time reflected in CloudWatch, you will need to ensure your formatter is a `Hash` with a key for `message` which will contain your log message, and `epoch_time` which should be an epoch time formatted timestamp for your log entry, like so:
91
+
92
+ ```ruby
93
+ logger.formatter = proc do |severity, datetime, progname, msg|
94
+ {
95
+ message: "CUSTOM FORMATTER PREFIX: #{msg}\n",
96
+ epoch_time: (datetime.utc.to_f.round(3) * 1000).to_i
97
+ }
98
+ end
99
+ ```
100
+
83
101
  Releasing
84
102
  -----
85
103
 
@@ -5,10 +5,10 @@ Gem::Specification.new do |s|
5
5
  s.name = 'cloudwatchlogger'
6
6
  s.version = CloudWatchLogger::VERSION
7
7
  s.date = Time.now
8
- s.summary = 'AWS CloudWatchLogs compatiable logger for ruby.'
8
+ s.summary = 'Amazon CloudWatch Logs compatiable logger for ruby.'
9
9
  s.description = 'Logger => CloudWatchLogs'
10
10
 
11
- s.license = "http://opensource.org/licenses/MIT"
11
+ s.license = "MIT"
12
12
 
13
13
  s.authors = ["Zane Shannon"]
14
14
  s.email = 'z@zcs.me'
@@ -50,17 +50,14 @@ module CloudWatchLogger
50
50
  loop do
51
51
  connect!(opts) if @client.nil?
52
52
 
53
- msg = @queue.pop
54
- break if msg == :__delivery_thread_exit_signal__
53
+ message_object = @queue.pop
54
+ break if message_object == :__delivery_thread_exit_signal__
55
55
 
56
56
  begin
57
57
  event = {
58
58
  log_group_name: @log_group_name,
59
59
  log_stream_name: @log_stream_name,
60
- log_events: [{
61
- timestamp: (Time.now.utc.to_f.round(3) * 1000).to_i,
62
- message: msg
63
- }]
60
+ log_events: [log_event(message_object)]
64
61
  }
65
62
  event[:sequence_token] = @sequence_token if @sequence_token
66
63
  response = @client.put_log_events(event)
@@ -93,13 +90,11 @@ module CloudWatchLogger
93
90
  end
94
91
 
95
92
  def connect!(opts = {})
96
- @client = Aws::CloudWatchLogs::Client.new(
97
- region: @opts[:region] || 'us-east-1',
98
- access_key_id: @credentials[:access_key_id],
99
- secret_access_key: @credentials[:secret_access_key],
100
- http_open_timeout: opts[:open_timeout],
101
- http_read_timeout: opts[:read_timeout]
102
- )
93
+ args = { http_open_timeout: opts[:open_timeout], http_read_timeout: opts[:read_timeout] }
94
+ args[:region] = @opts[:region] if @opts[:region]
95
+ args.merge!( @credentials.key?(:access_key_id) ? { access_key_id: @credentials[:access_key_id], secret_access_key: @credentials[:secret_access_key] } : {} )
96
+
97
+ @client = Aws::CloudWatchLogs::Client.new(args)
103
98
  begin
104
99
  @client.create_log_stream(
105
100
  log_group_name: @log_group_name,
@@ -110,8 +105,21 @@ module CloudWatchLogger
110
105
  log_group_name: @log_group_name
111
106
  )
112
107
  retry
113
- rescue Aws::CloudWatchLogs::Errors::ResourceAlreadyExistsException
108
+ rescue Aws::CloudWatchLogs::Errors::ResourceAlreadyExistsException,
109
+ Aws::CloudWatchLogs::Errors::AccessDeniedException
110
+ end
111
+ end
112
+
113
+ def log_event(message_object)
114
+ timestamp = (Time.now.utc.to_f.round(3) * 1000).to_i
115
+ message = message_object
116
+
117
+ if message_object.is_a?(Hash) && %i[epoch_time message].all?{ |s| message_object.key?(s) }
118
+ timestamp = message_object[:epoch_time]
119
+ message = message_object[:message]
114
120
  end
121
+
122
+ { timestamp: timestamp, message: message }
115
123
  end
116
124
  end
117
125
  end
@@ -33,11 +33,11 @@ module CloudWatchLogger
33
33
  end.join(', ')
34
34
  end
35
35
 
36
- def formatter
36
+ def formatter(format=nil)
37
37
  proc do |severity, datetime, progname, msg|
38
38
  processid = Process.pid
39
- if @format == :json && msg.is_a?(Hash)
40
- MultiJson.dump(msg.merge(severity: severity,
39
+ if format == :json && msg.is_a?(Hash)
40
+ message = MultiJson.dump(msg.merge(severity: severity,
41
41
  datetime: datetime,
42
42
  progname: progname,
43
43
  pid: processid))
@@ -45,6 +45,11 @@ module CloudWatchLogger
45
45
  message = "#{datetime} "
46
46
  message << massage_message(msg, severity, processid)
47
47
  end
48
+
49
+ {
50
+ message: message,
51
+ epoch_time: epoch_from(datetime)
52
+ }
48
53
  end
49
54
  end
50
55
 
@@ -80,6 +85,10 @@ module CloudWatchLogger
80
85
  uuid = UUID.new
81
86
  @log_stream_name ||= "#{Socket.gethostname}-#{uuid.generate}"
82
87
  end
88
+
89
+ def epoch_from(datetime)
90
+ (datetime.utc.to_f.round(3) * 1000).to_i
91
+ end
83
92
  end
84
93
  end
85
94
  end
@@ -1,3 +1,3 @@
1
1
  module CloudWatchLogger
2
- VERSION = '0.2.1'.freeze
2
+ VERSION = '1.0.1'.freeze
3
3
  end
@@ -11,7 +11,7 @@ module CloudWatchLogger
11
11
  logger = Logger.new(client)
12
12
 
13
13
  if client.respond_to?(:formatter)
14
- logger.formatter = client.formatter
14
+ logger.formatter = client.formatter(opts[:format])
15
15
  elsif client.respond_to?(:datetime_format)
16
16
  logger.datetime_format = client.datetime_format
17
17
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudwatchlogger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zane Shannon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-19 00:00:00.000000000 Z
11
+ date: 2022-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: uuid
@@ -69,7 +69,7 @@ files:
69
69
  - lib/cloudwatchlogger/version.rb
70
70
  homepage: http://github.com/zshannon/cloudwatchlogger
71
71
  licenses:
72
- - http://opensource.org/licenses/MIT
72
+ - MIT
73
73
  metadata: {}
74
74
  post_install_message:
75
75
  rdoc_options: []
@@ -86,9 +86,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
86
  - !ruby/object:Gem::Version
87
87
  version: 1.3.6
88
88
  requirements: []
89
- rubyforge_project:
90
- rubygems_version: 2.6.11
89
+ rubygems_version: 3.2.3
91
90
  signing_key:
92
91
  specification_version: 4
93
- summary: AWS CloudWatchLogs compatiable logger for ruby.
92
+ summary: Amazon CloudWatch Logs compatiable logger for ruby.
94
93
  test_files: []