Make our loggers singletons.

This commit is contained in:
Greyson Parrelli
2025-08-04 11:31:45 -04:00
committed by Cody Henthorne
parent ec7a2f734a
commit 26df14124b
10 changed files with 26 additions and 12 deletions

View File

@@ -26,7 +26,7 @@ class SignalInstrumentationApplicationContext : ApplicationContext() {
} }
override fun initializeLogging() { override fun initializeLogging() {
Log.initialize({ true }, AndroidLogger(), PersistentLogger(this), inMemoryLogger) Log.initialize({ true }, AndroidLogger, PersistentLogger.getInstance(this), inMemoryLogger)
SignalProtocolLoggerProvider.setProvider(CustomSignalProtocolLogger()) SignalProtocolLoggerProvider.setProvider(CustomSignalProtocolLogger())

View File

@@ -334,7 +334,7 @@ public class ApplicationContext extends Application implements AppForegroundObse
@VisibleForTesting @VisibleForTesting
protected void initializeLogging() { protected void initializeLogging() {
Log.initialize(RemoteConfig::internalUser, new AndroidLogger(), new PersistentLogger(this)); Log.initialize(RemoteConfig::internalUser, AndroidLogger.INSTANCE, PersistentLogger.getInstance(this));
SignalProtocolLoggerProvider.setProvider(new CustomSignalProtocolLogger()); SignalProtocolLoggerProvider.setProvider(new CustomSignalProtocolLogger());
SignalProtocolLoggerProvider.initializeLogging(BuildConfig.LIBSIGNAL_LOG_LEVEL); SignalProtocolLoggerProvider.initializeLogging(BuildConfig.LIBSIGNAL_LOG_LEVEL);

View File

@@ -25,9 +25,7 @@ import java.util.Locale
* - Main thread creates a [LogRequest] object and puts it in a queue * - Main thread creates a [LogRequest] object and puts it in a queue
* - The [WriteThread] constantly pulls from that queue, formats the logs, and writes them to the database. * - The [WriteThread] constantly pulls from that queue, formats the logs, and writes them to the database.
*/ */
class PersistentLogger( class PersistentLogger private constructor(application: Application) : Log.Logger() {
application: Application
) : Log.Logger() {
companion object { companion object {
private const val LOG_V = "V" private const val LOG_V = "V"
@@ -35,6 +33,22 @@ class PersistentLogger(
private const val LOG_I = "I" private const val LOG_I = "I"
private const val LOG_W = "W" private const val LOG_W = "W"
private const val LOG_E = "E" private const val LOG_E = "E"
@Volatile
private var instance: PersistentLogger? = null
@JvmStatic
fun getInstance(application: Application): PersistentLogger {
if (instance == null) {
synchronized(PersistentLogger::class.java) {
if (instance == null) {
instance = PersistentLogger(application)
}
}
}
return requireNotNull(instance)
}
} }
private val logEntries = LogRequests() private val logEntries = LogRequests()

View File

@@ -78,7 +78,7 @@ class AvatarProvider : BaseContentProvider() {
SignalStore.init(application) SignalStore.init(application)
Log.initialize(RemoteConfig::internalUser, AndroidLogger(), PersistentLogger(application)) Log.initialize(RemoteConfig::internalUser, AndroidLogger, PersistentLogger.getInstance(application))
if (!AppDependencies.isInitialized) { if (!AppDependencies.isInitialized) {
Log.i(TAG, "Initializing AppDependencies.") Log.i(TAG, "Initializing AppDependencies.")

View File

@@ -87,7 +87,7 @@ class SpinnerApplicationContext : ApplicationContext() {
) )
) )
Log.initialize({ RemoteConfig.internalUser }, AndroidLogger(), PersistentLogger(this), SpinnerLogger()) Log.initialize({ RemoteConfig.internalUser }, AndroidLogger, PersistentLogger.getInstance(this), SpinnerLogger)
DatabaseMonitor.initialize(object : QueryMonitor { DatabaseMonitor.initialize(object : QueryMonitor {
override fun onSql(sql: String, args: Array<Any>?) { override fun onSql(sql: String, args: Array<Any>?) {

View File

@@ -6,7 +6,7 @@ import java.util.concurrent.Executor
import java.util.concurrent.Executors import java.util.concurrent.Executors
@SuppressLint("LogNotSignal") @SuppressLint("LogNotSignal")
class AndroidLogger : Log.Logger() { object AndroidLogger : Log.Logger() {
private val serialExecutor: Executor = Executors.newSingleThreadExecutor { Thread(it, "signal-logcat") } private val serialExecutor: Executor = Executors.newSingleThreadExecutor { Thread(it, "signal-logcat") }

View File

@@ -27,7 +27,7 @@ class QrMainActivity : AppCompatActivity() {
@SuppressLint("NewApi", "SetTextI18n") @SuppressLint("NewApi", "SetTextI18n")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
Log.initialize( Log.initialize(
AndroidLogger(), AndroidLogger,
object : Log.Logger() { object : Log.Logger() {
override fun v(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) { override fun v(tag: String, message: String?, t: Throwable?, keepLonger: Boolean) {
printlnFormatted('v', tag, message, t) printlnFormatted('v', tag, message, t)

View File

@@ -33,7 +33,7 @@ class MainActivity : AppCompatActivity() {
emptyMap() emptyMap()
) )
Log.initialize(AndroidLogger(), SpinnerLogger()) Log.initialize(AndroidLogger, SpinnerLogger)
object : Thread() { object : Thread() {
override fun run() { override fun run() {

View File

@@ -9,7 +9,7 @@ import android.os.Looper
import android.util.Log import android.util.Log
import org.signal.core.util.logging.Log.Logger import org.signal.core.util.logging.Log.Logger
class SpinnerLogger : Logger() { object SpinnerLogger : Logger() {
private val cachedThreadString: ThreadLocal<String> = ThreadLocal() private val cachedThreadString: ThreadLocal<String> = ThreadLocal()

View File

@@ -54,7 +54,7 @@ class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
Log.initialize(AndroidLogger()) Log.initialize(AndroidLogger)
val startPlaybackScreen = { saveChoice: Boolean -> proceed(Screen.TEST_PLAYBACK, saveChoice) } val startPlaybackScreen = { saveChoice: Boolean -> proceed(Screen.TEST_PLAYBACK, saveChoice) }
val startTranscodeScreen = { saveChoice: Boolean -> proceed(Screen.TEST_TRANSCODE, saveChoice) } val startTranscodeScreen = { saveChoice: Boolean -> proceed(Screen.TEST_TRANSCODE, saveChoice) }