thinkingdata-ruby 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,77 +1,99 @@
1
- require 'logger'
2
- require 'thinkingdata-ruby/td_errors'
3
-
4
- module ThinkingData
5
-
6
- ##
7
- # Dismantle the header and save it under another name
8
- class HeadlessLogger < Logger
9
- def initialize(logdev, shift_age = 0, shift_size = 1048576)
10
- super(nil)
11
- if logdev
12
- @logdev = HeadlessLogger::LogDevice.new(logdev, shift_age: shift_age, shift_size: shift_size)
13
- end
14
- end
15
-
16
- class LogDevice < ::Logger::LogDevice
17
- def add_log_header(file); end
18
- end
19
- end
20
-
21
- ##
22
- # Write data to file, it works with LogBus
23
- class TDLoggerConsumer
24
-
25
- ##
26
- # Init logger consumer
27
- # @param log_path: log file's path
28
- # @param mode: file rotate mode
29
- # @param prefix: file prefix
30
- def initialize(log_path='.', mode='daily', prefix:'te.log')
31
- case mode
32
- when 'hourly'
33
- @suffix_mode = '%Y-%m-%d-%H'
34
- when 'daily'
35
- @suffix_mode = '%Y-%m-%d'
36
- else
37
- raise IllegalParameterError.new("#{mode} is unsupported for LoggerConsumer. Replaced it by daily or hourly")
38
- end
39
-
40
- raise IllegalParameterError.new("prefix couldn't be empty") if prefix.nil? || prefix.length == 0
41
-
42
- @current_suffix = Time.now.strftime(@suffix_mode)
43
- @log_path = log_path
44
- @full_prefix = "#{log_path}/#{prefix}"
45
- TDLog.info("TDLoggerConsumer init success. LogPath: #{log_path}")
46
- _reset
47
- end
48
-
49
- def add(msg)
50
- unless Time.now.strftime(@suffix_mode) == @current_suffix
51
- @logger.close
52
- @current_suffix = Time.now.strftime(@suffix_mode)
53
- _reset
54
- end
55
- msg_json_str = msg.to_json
56
- TDLog.info("Write data to file: #{msg_json_str}")
57
- @logger.info(msg_json_str)
58
- end
59
-
60
- def close
61
- @logger.close
62
- TDLog.info("TDLoggerConsumer close.")
63
- end
64
-
65
- private
66
-
67
- def _reset
68
- Dir::mkdir(@log_path) unless Dir::exist?(@log_path)
69
- @logger = HeadlessLogger.new("#{@full_prefix}.#{@current_suffix}")
70
- @logger.level = HeadlessLogger::INFO
71
- @logger.formatter = proc do |severity, datetime, progname, msg|
72
- "#{msg}\n"
73
- end
74
- end
75
-
76
- end
1
+ require 'logger'
2
+ require 'fileutils'
3
+ require 'thinkingdata-ruby/td_errors'
4
+
5
+ module ThinkingData
6
+
7
+ ##
8
+ # Dismantle the header and save it under another name
9
+ class HeadlessLogger < Logger
10
+ def initialize(logdev, shift_age = 0, shift_size = 1048576)
11
+ super(nil)
12
+ if logdev
13
+ @logdev = HeadlessLogger::LogDevice.new(logdev, shift_age: shift_age, shift_size: shift_size)
14
+ end
15
+ end
16
+
17
+ class LogDevice < ::Logger::LogDevice
18
+ def add_log_header(file); end
19
+ end
20
+ end
21
+
22
+ ##
23
+ # Write data to file, it works with LogBus
24
+ class TDLoggerConsumer
25
+
26
+ ##
27
+ # Init logger consumer
28
+ # @param log_path: log file's path
29
+ # @param mode: file rotate mode
30
+ # @param prefix: file prefix
31
+ def initialize(log_path='.', mode='daily', prefix:'te.log')
32
+ case mode
33
+ when 'hourly'
34
+ @suffix_mode = '%Y-%m-%d-%H'
35
+ when 'daily'
36
+ @suffix_mode = '%Y-%m-%d'
37
+ else
38
+ raise IllegalParameterError.new("#{mode} is unsupported for LoggerConsumer. Replaced it by daily or hourly")
39
+ end
40
+
41
+ raise IllegalParameterError.new("prefix couldn't be empty") if prefix.nil? || prefix.length == 0
42
+
43
+ @current_suffix = Time.now.strftime(@suffix_mode)
44
+ @log_path = log_path
45
+ @full_prefix = "#{log_path}/#{prefix}"
46
+ @mutex = Mutex.new
47
+ @owner_pid = Process.pid
48
+ TDLog.info("TDLoggerConsumer init success. LogPath: #{log_path}")
49
+ _reset
50
+ end
51
+
52
+ def add(msg)
53
+ _reset_after_fork_if_needed
54
+ @mutex.synchronize do
55
+ unless Time.now.strftime(@suffix_mode) == @current_suffix
56
+ @logger.close
57
+ @current_suffix = Time.now.strftime(@suffix_mode)
58
+ _reset
59
+ end
60
+ msg_json_str = msg.to_json
61
+ TDLog.info("Write data to file: #{msg_json_str}")
62
+ @logger.info(msg_json_str)
63
+ end
64
+ end
65
+
66
+ def flush
67
+ # Logger writes immediately on each call, no explicit flush needed
68
+ TDLog.info("TDLoggerConsumer flush.")
69
+ end
70
+
71
+ def close
72
+ _reset_after_fork_if_needed
73
+ @mutex.synchronize do
74
+ @logger.close
75
+ end
76
+ TDLog.info("TDLoggerConsumer close.")
77
+ end
78
+
79
+ private
80
+
81
+ def _reset
82
+ FileUtils.mkdir_p(@log_path)
83
+ @logger = HeadlessLogger.new("#{@full_prefix}.#{@current_suffix}")
84
+ @logger.level = HeadlessLogger::INFO
85
+ @logger.formatter = proc do |severity, datetime, progname, msg|
86
+ "#{msg}\n"
87
+ end
88
+ end
89
+
90
+ def _reset_after_fork_if_needed
91
+ return if @owner_pid == Process.pid
92
+ @owner_pid = Process.pid
93
+ @mutex = Mutex.new
94
+ @logger = nil # Don't close — FD is shared with parent
95
+ _reset
96
+ end
97
+
98
+ end
77
99
  end
@@ -1,3 +1,3 @@
1
- module ThinkingData
2
- VERSION = '2.0.0'
3
- end
1
+ module ThinkingData
2
+ VERSION = '2.0.2'
3
+ end
@@ -1,5 +1,5 @@
1
- require 'thinkingdata-ruby/td_logger_consumer'
2
- require 'thinkingdata-ruby/td_debug_consumer'
3
- require 'thinkingdata-ruby/td_batch_consumer'
4
- require 'thinkingdata-ruby/td_analytics'
1
+ require 'thinkingdata-ruby/td_logger_consumer'
2
+ require 'thinkingdata-ruby/td_debug_consumer'
3
+ require 'thinkingdata-ruby/td_batch_consumer'
4
+ require 'thinkingdata-ruby/td_analytics'
5
5
  require 'thinkingdata-ruby/td_errors'
@@ -1,16 +1,16 @@
1
- require File.join(File.dirname(__FILE__), 'lib/thinkingdata-ruby/td_version.rb')
2
-
3
- spec = Gem::Specification.new do |spec|
4
- spec.name = 'thinkingdata-ruby'
5
- spec.version = ThinkingData::VERSION
6
- spec.files = Dir.glob(`git ls-files`.split("\n"))
7
- spec.require_paths = ['lib']
8
- spec.summary = 'Official ThinkingData Analytics API for ruby'
9
- spec.description = 'The official ThinkingData Analytics API for ruby'
10
- spec.authors = [ 'ThinkingData' ]
11
- spec.email = 'sdk@thinkingdata.cn'
12
- spec.homepage = 'https://github.com/ThinkingDataAnalytics/ruby-sdk'
13
- spec.license = 'Apache-2.0'
14
-
15
- spec.required_ruby_version = '>= 2.0.0'
16
- end
1
+ require File.join(File.dirname(__FILE__), 'lib/thinkingdata-ruby/td_version.rb')
2
+
3
+ spec = Gem::Specification.new do |spec|
4
+ spec.name = 'thinkingdata-ruby'
5
+ spec.version = ThinkingData::VERSION
6
+ spec.files = Dir.glob(`git ls-files`.split("\n"))
7
+ spec.require_paths = ['lib']
8
+ spec.summary = 'Official ThinkingData Analytics API for ruby'
9
+ spec.description = 'The official ThinkingData Analytics API for ruby'
10
+ spec.authors = [ 'ThinkingData' ]
11
+ spec.email = 'sdk@thinkingdata.cn'
12
+ spec.homepage = 'https://github.com/ThinkingDataAnalytics/ruby-sdk'
13
+ spec.license = 'Apache-2.0'
14
+
15
+ spec.required_ruby_version = '>= 2.0.0'
16
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thinkingdata-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - ThinkingData
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-10-26 00:00:00.000000000 Z
11
+ date: 2026-06-05 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: The official ThinkingData Analytics API for ruby
14
14
  email: sdk@thinkingdata.cn
@@ -34,7 +34,7 @@ homepage: https://github.com/ThinkingDataAnalytics/ruby-sdk
34
34
  licenses:
35
35
  - Apache-2.0
36
36
  metadata: {}
37
- post_install_message:
37
+ post_install_message:
38
38
  rdoc_options: []
39
39
  require_paths:
40
40
  - lib
@@ -49,8 +49,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
49
49
  - !ruby/object:Gem::Version
50
50
  version: '0'
51
51
  requirements: []
52
- rubygems_version: 3.4.6
53
- signing_key:
52
+ rubygems_version: 3.0.3.1
53
+ signing_key:
54
54
  specification_version: 4
55
55
  summary: Official ThinkingData Analytics API for ruby
56
56
  test_files: []