Logging 在CF或Heroku中部署的Spring Boot应用程序中如何以及在何处存储日志文件?

Logging 在CF或Heroku中部署的Spring Boot应用程序中如何以及在何处存储日志文件?,logging,heroku,spring-boot,jhipster,cloud-foundry,Logging,Heroku,Spring Boot,Jhipster,Cloud Foundry,我创建了一个JHipster webapp(SpringBoot&Angular Js),并将其部署在Pivotal CF和Heroku上 我将日志文件保存在src/main/webapp/logs/目录下,该目录在localhost中运行良好,但在Pivotal CF和Heroku中部署时,我收到以下错误消息 对不起,发生了一个错误 状态:未找到(未找到) 消息:没有可用消息 问题: 我可以查看日志文件列表,并在localhost中下载或查看日志文件的内容,但在CF或Heroku中部署时,我只

我创建了一个JHipster webapp(SpringBoot&Angular Js),并将其部署在Pivotal CF和Heroku上

我将日志文件保存在
src/main/webapp/logs/
目录下,该目录在localhost中运行良好,但在Pivotal CF和Heroku中部署时,我收到以下错误消息

对不起,发生了一个错误

状态:未找到(未找到)

消息:没有可用消息

问题

  • 我可以查看日志文件列表,并在localhost中下载或查看日志文件的内容,但在CF或Heroku中部署时,我只能看到日志文件名列表,但无法访问日志文件。 因为我能够看到文件名列表,这意味着日志文件存在于CF/Heroku目录中。那么为什么我不能访问它们呢

  • 我可以在Heroku或Pivotal CF应用程序空间中保存日志文件吗

  • 我知道我不应该像上面那样保存日志文件,只是想知道为什么这在CF/Heroku中不起作用

  • 当我的应用程序部署在Heroku或CF上时,存储日志文件的最佳、简单且便宜的方法是什么?AWS S3存储

  • 这是我的名片

    这里是我的应用程序的链接

    使用以下凭据登录:

    用户名:用户密码:用户

    导航到管理->日志

    请不要更改密码。谢谢

    下面是我的代码片段:

    返回
    src/main/webapp/logs/
    目录中的日志文件名列表

    @RequestMapping(value = "/logs/files",
            method = RequestMethod.GET,
            produces = MediaType.APPLICATION_JSON_VALUE)
    @Timed
    public List<String> getLogFileNames() throws IOException {
    
        Resource resource = resourceLoader.getResource("file:src/main/webapp/logs");
        System.out.println("resource : "+ resource);
        File file = resource.getFile();
        File[] listFiles = file.listFiles();
        List<String> fileNames = new ArrayList<>();
        List<File> list = Arrays.asList(listFiles);
        for (File f : list) {
            System.out.println(f.getName());
            fileNames.add(f.getName());
        }           
    
        return fileNames;
    }
    
    logs.html:

    <form class="form-inline">
      <div class="form-group">
        <div class="dropdown">
          <button class="btn btn-success btn-md dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
            Click to Open Log Files
            <span class="caret"></span>
          </button>
          <ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
            <li ng-repeat="(key, value) in logFileNames" value="{{value}}" style="width:100%;">
                <a ng-href="/logs/{{value}}" target="_blank"><strong>{{value}}</strong> </a>
            </li>
          </ul>
        </div>
      </div>
    </form>
    
    
    单击以打开日志文件
    

    在cloud foundry环境中,应用程序实例在容器中运行。在PCF中,容器是一个花园单元。该单元拥有的存储称为“临时存储”。这意味着,只要容器处于活动状态,应用程序就拥有存储空间

    如果应用程序实例死亡,云计算将销毁容器。这包括临时存储。当一个新的应用实例启动时,它的容器将拥有全新的存储空间,同样是短暂的

    这就是为什么在CloudFoundry中,您的应用程序不能在运行时依赖本地文件系统


    请查看“12因素应用程序”文档()。它将在开发云本地应用程序时派上用场。

    在学习了Docker的概念后,我意识到“如果应用程序实例死亡…”对PCF和Heroku也是如此。那么,如何存储日志呢?“12因素应用程序”说只需将日志整理出来。如何配置其他工具(如Splunk或ElasticSearch)来捕获日志?任何参考链接?PCF提供<代码> LogGReGuase<代码>组件,用于从基础组件中收集所有组件和应用程序的日志。这里有一个链接到解释它的文章-。所有日志都通过称为“消防软管”的端点暴露出来。要捕获日志,请安装“喷嘴”。部署到cloud foundry后,一个“喷嘴”应用程序连接到“消防软管”并将日志转发到Splunk或Kafka bridge。您可以做的另一件事是安装
    消防软管插件
    。它将允许您在现场查看生成的日志,并让您了解什么是消防水龙带。
    angular.module('blogaggrApp')
    .factory('LogsFileNameService', function ($resource) {
        return $resource('api/logs/files', {}, {
            'getLogFileNames': { method: 'GET', isArray: true}
        });
    });
    
    <form class="form-inline">
      <div class="form-group">
        <div class="dropdown">
          <button class="btn btn-success btn-md dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
            Click to Open Log Files
            <span class="caret"></span>
          </button>
          <ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
            <li ng-repeat="(key, value) in logFileNames" value="{{value}}" style="width:100%;">
                <a ng-href="/logs/{{value}}" target="_blank"><strong>{{value}}</strong> </a>
            </li>
          </ul>
        </div>
      </div>
    </form>