Android写入日志文本文件

y r*_*rao 119 android

我正在尝试使用Mine的代码将日志写入Android文件上的自定义Log.txt文件,但此方法创建文件但不包含任何内容.基本上我想读取文件的先前内容,然后用现有内容附加我的数据.

守则如下:

public static void write(String str) 
    {
        InputStream fileInputStream = null;
        FileOutputStream fileOutpurStream = null;
        try
        { 
            fileInputStream = new FileInputStream(file);
            fileOutpurStream = new FileOutputStream(file);
            if(file.exists())
            {
                int ch = 0;
                int current = 0;
                StringBuffer buffer = new StringBuffer();
                while((ch = fileInputStream.read()) != -1)
                {
                    buffer.append((char) ch);
                    current++;
                }
                byte data[]=new byte[(int)file.length()];
                fileInputStream.read(data);   
                fileOutpurStream.write(data);
                fileOutpurStream.write(str.getBytes(),0,str.getBytes().length);
                fileOutpurStream.flush();
            } 
            else
            {   
                file.createNewFile();
                fileOutpurStream.write(str.getBytes(),0,str.getBytes().length);
                fileOutpurStream.flush();
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                fileInputStream.close();
                fileOutpurStream.flush();
                fileOutpurStream.close();
                fileOutpurStream = null;
                fileInputStream = null;
            }
            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
Run Code Online (Sandbox Code Playgroud)

out*_*ast 241

希望这可以帮助......

public void appendLog(String text)
{       
   File logFile = new File("sdcard/log.file");
   if (!logFile.exists())
   {
      try
      {
         logFile.createNewFile();
      } 
      catch (IOException e)
      {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }
   try
   {
      //BufferedWriter for performance, true to set append to file flag
      BufferedWriter buf = new BufferedWriter(new FileWriter(logFile, true)); 
      buf.append(text);
      buf.newLine();
      buf.close();
   }
   catch (IOException e)
   {
      // TODO Auto-generated catch block
      e.printStackTrace();
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记在Manifest中添加writing_external_storage的权限! (82认同)
  • 我建议重构代码,以便`buf.close()`在`finally`块中. (8认同)
  • 我需要添加buf.flush(); beforebuf.close(); 但是tjis功能正是我需要的.谢谢 (5认同)
  • 我应该从哪里调用这个函数,以便它将所有应用程序的日志写入文件??? (3认同)
  • 当然,“ @ uses-permission android:name =“ android.permission.WRITE_EXTERNAL_STORAGE” />`是@ virusss8的意思。 (2认同)
  • 即使清单文件正确,尝试写入“sdcard/log.file”路径也会导致权限被拒绝。必须使用 context.getFilesDir() 代替 (2认同)

Kir*_*ran 27

对于那些刚接触Java日志记录和Android日志记录的人

  1. Log4j是通用的Java日志记录实现,现在是Apache软件基础的一个项目.它不是Android特定的,因此与Android有一些不兼容性.
  2. SL4J不是日志记录实现,它是一个抽象层.它有助于避免每个第三方库依赖于项目的情况,尝试使用自己的日志记录实现,如Log4j.来源.

在Android中记录到txt的一些选项如下

  1. 使用logcat -f在本作回答,以日志记录文件.请注意,从Android 4.2开始,READ_LOGS权限不会产生任何影响,并且每个应用程序(除非手机已植根)只能读取自己的日志.这里的缺点是logcat缓冲区是循环的并且具有大小限制.您可能无法获得更早的日志.
  2. 使用microlog4android(为Android等移动设备编写),如前面的答案.可能有一种方法,但我无法想象,如何使用microlog4Android记录到应用程序内部存储.只有日志路径的选项是外部存储,如SD卡,所以我无法使用它.
  3. Log4jandroid-logging-log4j一起使用.android-logging-log4j有什么作用?它通过提供两个函数使Log4j更容易在Android中使用.

    • 除了记录文件之外,还可以选择将日志发送到logcat
    • 通过提供LogConfigurator类,设置Log4j配置选项(如文件路径,最大文件大小,备份数量等)的简单方法.

    简单的例子如下.请注意,logger下面示例中的对象是返回的Log4j对象,而不是android-logging-log4j类.所以android-logging-log4j仅用于配置Log4j.

  4. 然而,尝试LogBack.LogBack是由提出Log4J 1.x和SL4J库的人开发的.与Log4j 2.x无关.

在Android中使用Log4j的步骤.

  1. log4j-1.2.x.jarandroid-logging-log4j-1.0.3.jar添加到libs文件夹中.

  2. 仅在使用外部存储时添加权限
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

  3. Log4j助手班

    package com.example.logger;
    
    import android.os.Environment;
    import de.mindpipe.android.logging.log4j.LogConfigurator;
    
    public class Log4jHelper {
        private final static LogConfigurator mLogConfigrator = new LogConfigurator();
    
        static {
            configureLog4j();
        }
    
        private static void configureLog4j() {
            String fileName = Environment.getExternalStorageDirectory() + "/" + "log4j.log";
            String filePattern = "%d - [%c] - %p : %m%n";
            int maxBackupSize = 10;
            long maxFileSize = 1024 * 1024;
    
            configure( fileName, filePattern, maxBackupSize, maxFileSize );
        }
    
        private static void configure( String fileName, String filePattern, int maxBackupSize, long maxFileSize ) {
            mLogConfigrator.setFileName( fileName );
            mLogConfigrator.setMaxFileSize( maxFileSize );
            mLogConfigrator.setFilePattern(filePattern);
            mLogConfigrator.setMaxBackupSize(maxBackupSize);
            mLogConfigrator.setUseLogCatAppender(true);
            mLogConfigrator.configure();
    
        }
    
        public static org.apache.log4j.Logger getLogger( String name ) {
            org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger( name );
            return logger;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在Activity类中

    org.apache.log4j.Logger log= Log4jHelper.getLogger( "YourActivity" );
    log.error("Error");
    log.info("Info");
    log.warn("Warn");
    
    Run Code Online (Sandbox Code Playgroud)

示例来源.请注意,从头开始重写的log4j 2.x(改进的功能)与log4j 1.x无法向后兼容.所以你必须使用log4j 1.2.x jar和android-logging-log4j jar.我能够登录到应用程序内部文件,然后通过电子邮件发送文件setReadable(true, false)


Hen*_*ett 24

microlog4android适合我,但文档很差.他们需要添加的是这是一个快速入门教程.

这是我发现的快速教程.

  1. 在主Activity中添加以下静态变量:

    private static final Logger logger = LoggerFactory.getLogger();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将以下内容添加到您的onCreate()方法:

    PropertyConfigurator.getConfigurator(this).configure();
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建一个名为的文件microlog.properties并将其存储在assets目录中

  4. 编辑microlog.properties文件如下:

    microlog.level=DEBUG
    microlog.appender=LogCatAppender;FileAppender
    microlog.formatter=PatternFormatter
    microlog.formatter.PatternFormatter.pattern=%c [%P] %m %T
    
    Run Code Online (Sandbox Code Playgroud)
  5. 像这样添加日志记录语句:

    logger.debug("M4A");
    
    Run Code Online (Sandbox Code Playgroud)

对于每个类,您将创建1)中指定的记录器对象

6.您可以添加以下权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

这是教程的来源

  • FileAppender将在你的SD卡上创建一个文件"microlog.txt"(我的案例中的完整路径是"/sdcard/microlog.txt"). (4认同)
  • 本快速教程应该是Microlog4Android官方文档的一部分. (2认同)

BeM*_*ive 10

警告:我可能完全误解了你,但如果你想要的只是一个日志文件,为什么会出汗呢?

把它放在一个bat文件中(更改工具目录的路径,yourappname当然是你的app的名字):

cd "C:\devAndroid\Software\android-sdk-windows-1.6_r1\android-sdk-windows-1.6_r1\tools"
adb logcat -v time   ActivityManager:W  yourappname:D  *:W >"C:\devAndroid\log\yourappname.log"
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中做一些类似的事情:

Log.d("yourappname", "Your message");
Run Code Online (Sandbox Code Playgroud)

要创建日志,请连接USB电缆并运行bat文件.

问候

  • 如果您在运行应用程序时没有靠近PC,这是如何工作的? (18认同)

kli*_*mat 8

使用slf4android lib.使用android java.util.logging.*
实现slf4j api的简单实现.

特征:

  • 记录到开箱即用的文件
  • 通过登录到任何其他目的地 LoggerConfiguration.configuration().addHandlerToLogger
  • 摇动您的设备,通过电子邮件发送带有屏幕截图
  • 真的很小,只花了~55kB

slf4android主要由@miensol维护.

在我们的博客上阅读有关slf4android的更多信息:


Nic*_*hek 8

经过长时间的调查我发现:

\n\n
    \n
  • android.util.Log默认使用java.util.logging.Logger
  • \n
  • LogCat 使用loggername""来获取它的实例LogManager.getLogManager().getLogger("")
  • \n
  • Android 设备在调试应用程序运行后添加到 LogCatlogger实例com.android.internal.logging.AndroidHandler
  • \n
  • 但!!!com.android.internal.logging.AndroidHandler仅将级别以上的消息打印到 logcat,java.util.logging.Level.INFO例如 ( Level.INFO, Level.WARNING, Level.SEVERE, Level.OFF)
  • \n
\n\n

因此,要将日志写入文件只需添加rootLogger "" 一个java.util.logging.FileHandler

\n\n
  class App : Application{\n    override fun onCreate() {\n      super.onCreate()\n      Log.d(TAG, printLoggers("before setup"))\n\n      val rootLogger = java.util.logging.LogManager.getLogManager().getLogger("")\n      val dirFile = destinationFolder\n      val file = File(dirFile,"logFile.txt")\n      val handler = java.util.logging.FileHandler(file.absolutePath, 5* 1024 * 1024/*5Mb*/, 1, true)\n      handler.formatter = AndroidLogFormatter(filePath = file.absolutePath)\n\n      rootLogger?.addHandler(handler)\n\n      Log.d(TAG, printLoggers("after setup"))\n    }\n  }\n\nval destinationFolder: File\n        get() {\n            val parent = \n                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absoluteFile\n            val destinationFolder = File(parent, "MyApp")\n            if (!destinationFolder.exists()) {\n                destinationFolder.mkdirs()\n                destinationFolder.mkdir()\n            }\n            return destinationFolder\n        }\n
Run Code Online (Sandbox Code Playgroud)\n\n
class AndroidLogFormatter(val filePath: String = "", var tagPrefix: String = "") : Formatter() {\n\n    override fun format(record: LogRecord): String {\n        val tag = record.getTag(tagPrefix)\n        val date = record.getDate()\n        val level = record.getLogCatLevel()\n        val message = record.getLogCatMessage()\n        return "$date $level$tag: $message\\n"\n    }\n}\n\nfun LogRecord.getTag(tagPrefix: String): String {\n    val name = loggerName\n    val maxLength = 30\n    val tag = tagPrefix + (if (name.length > maxLength) name.substring(name.length - maxLength) else name)\n    return tag\n}\n\nfun LogRecord.getDate(): String? {\n    return Date(millis).formatedBy("yyyy-MM-dd HH:mm:ss.SSS")\n}\n\nfun Date?.formatedBy(dateFormat: String): String? {\n    val date = this\n    date ?: return null\n    val writeFormat = SimpleDateFormat(dateFormat, Locale.getDefault()) //MM \xd0\xb2 HH:mm\n    return writeFormat.format(date)\n}\n\nfun LogRecord.getLogCatMessage(): String {\n    var message = message\n\n    if (thrown != null) {\n        message += Log.getStackTraceString(thrown)\n    }\n    return message\n}\n\nfun Int.getAndroidLevel(): Int {\n    return when {\n        this >= Level.SEVERE.intValue() -> { // SEVERE\n            Log.ERROR\n        }\n        this >= Level.WARNING.intValue() -> { // WARNING\n            Log.WARN\n        }\n        this >= Level.INFO.intValue() -> { // INFO\n            Log.INFO\n        }\n        else -> {\n            Log.DEBUG\n        }\n    }\n}\n\nfun LogRecord.getLogCatLevel(): String {\n    return when (level.intValue().getAndroidLevel()) {\n        Log.ERROR -> { // SEVERE\n            "E/"\n        }\n        Log.WARN -> { // WARNING\n            "W/"\n        }\n        Log.INFO -> { // INFO\n            "I/"\n        }\n        Log.DEBUG -> {\n            "D/"\n        }\n        else -> {\n            "D/"\n        }\n    }\n}\n\nfun getLoggerLevel(level: Int): Level {\n    return when (level) {\n        Log.ERROR -> { // SEVERE\n            Level.SEVERE\n        }\n        Log.WARN -> { // WARNING\n            Level.WARNING\n        }\n        Log.INFO -> { // INFO\n            Level.INFO\n        }\n        Log.DEBUG -> {\n            Level.FINE\n        }\n        else -> {\n            Level.FINEST\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

要打印应用程序中的所有记录器,请使用:

\n\n
Log.e(TAG, printLoggers("before setup"))\n\n private fun printLoggers(caller: String, printIfEmpty: Boolean = true): String {\n        val builder = StringBuilder()\n        val loggerNames = LogManager.getLogManager().loggerNames\n        builder.appendln("--------------------------------------------------------------")\n        builder.appendln("printLoggers: $caller")\n        while (loggerNames.hasMoreElements()) {\n            val element = loggerNames.nextElement()\n            val logger = LogManager.getLogManager().getLogger(element)\n            val parentLogger: Logger? = logger.parent\n            val handlers = logger.handlers\n            val level = logger?.level\n            if (!printIfEmpty && handlers.isEmpty()) {\n                continue\n            }\n            val handlersNames = handlers.map {\n                val handlerName = it.javaClass.simpleName\n                val formatter: Formatter? = it.formatter\n                val formatterName = if (formatter is AndroidLogFormatter) {\n                    "${formatter.javaClass.simpleName}(${formatter.filePath})"\n                } else {\n                    formatter?.javaClass?.simpleName\n                }\n                "$handlerName($formatterName)"\n            }\n            builder.appendln("level: $level logger: \\"$element\\" handlers: $handlersNames parentLogger: ${parentLogger?.name}")\n        }\n        builder.appendln("--------------------------------------------------------------")\n        return builder.toString()\n    }\n
Run Code Online (Sandbox Code Playgroud)\n


dar*_*ius 7

你应该看看microlog4android.他们有一个准备好登录文件的解决方案.

http://code.google.com/p/microlog4android/

  • 这看起来像一个很好的库,但文档很糟糕.我根本无法弄清楚如何让它工作并最终把自己放在一起. (11认同)

And*_*ist 7

这可能会迟到但希望这可能会有所帮助..试试这个....

public void writefile()
    {
        File externalStorageDir = Environment.getExternalStorageDirectory();
        File myFile = new File(externalStorageDir , "yourfilename.txt");

        if(myFile.exists())
        {
           try
           {

        FileOutputStream fostream = new FileOutputStream(myFile);
        OutputStreamWriter oswriter = new OutputStreamWriter(fostream); 
        BufferedWriter bwriter = new BufferedWriter(oswriter);   
        bwriter.write("Hi welcome ");
        bwriter.newLine();            
        bwriter.close(); 
        oswriter.close(); 
        fostream.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
        else
        {
            try {
                myFile.createNewFile();
            }
            catch (IOException e) 
            {
                e.printStackTrace();
            }
        }
Run Code Online (Sandbox Code Playgroud)

这里bfwritter.newline将您的文本写入文件.并添加权限

 <uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"/>
Run Code Online (Sandbox Code Playgroud)

在你的清单文件中没有失败.


Nov*_*ova 5

我用命令行方式用下面的代码解决了这个问题:

File outputFile = new File("pathToFile"); 
Runtime.getRuntime().exec("logcat -c");
Runtime.getRuntime().exec("logcat -v time -f " + outputFile.getAbsolutePath())
Run Code Online (Sandbox Code Playgroud)

其中"time"选项为发布消息的进程的日期,调用时间,优先级/标记和PID添加元数据字段详细信息.

然后在你的代码中做一些类似的事情(使用android.util.Log):

Log.d("yourappname", "Your message");
Run Code Online (Sandbox Code Playgroud)

  • 连接`adb`时效果很好,但当设备处于独立模式时不起作用.我不会在生产中使用它,但它在调试模式下是一个简单的解决方案. (3认同)